diff --git a/activerecord/lib/active_record/attribute_methods/primary_key.rb b/activerecord/lib/active_record/attribute_methods/primary_key.rb index 768c5f8c05..e10f70a0b6 100644 --- a/activerecord/lib/active_record/attribute_methods/primary_key.rb +++ b/activerecord/lib/active_record/attribute_methods/primary_key.rb @@ -44,6 +44,10 @@ module ActiveRecord attribute_in_database(@primary_key) end + def id_for_database # :nodoc: + @attributes[@primary_key].value_for_database + end + private def attribute_method?(attr_name) attr_name == "id" || super diff --git a/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb b/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb index ce56586eb3..45cbc4baed 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb @@ -203,9 +203,7 @@ module ActiveRecord end def id_value_for_database(value) - if primary_key = value.class.primary_key - value.instance_variable_get(:@attributes)[primary_key].value_for_database - end + value.id_for_database end def _quote(value) diff --git a/activerecord/lib/active_record/sanitization.rb b/activerecord/lib/active_record/sanitization.rb index 58c31feedc..54f5f24040 100644 --- a/activerecord/lib/active_record/sanitization.rb +++ b/activerecord/lib/active_record/sanitization.rb @@ -193,13 +193,14 @@ module ActiveRecord def quote_bound_value(value, c = connection) if value.respond_to?(:map) && !value.acts_like?(:string) - quoted = value.map { |v| c.quote(v) } - if quoted.empty? + values = value.map { |v| v.respond_to?(:id_for_database) ? v.id_for_database : v } + if values.empty? c.quote(nil) else - quoted.join(",") + values.map! { |v| c.quote(v) }.join(",") end else + value = value.id_for_database if value.respond_to?(:id_for_database) c.quote(value) end end