diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 06deb23b..46cb7183 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -355,6 +355,9 @@ module ActiveModel serializable_hashes = (hash[key] ||= []) serializables.each do |serializable| + puts key + puts serializable.inspect + unless already_serialized.include? serializable.object already_serialized[serializable.object] = true serializable_hashes << serializable.serializable_hash diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 74afc1ca..0e06c698 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -109,9 +109,12 @@ module ActiveModel def serialize_ids # Use pluck or select_columns if available # return collection.ids if collection.respond_to?(:ids) - - associated_object.map do |item| - item.read_attribute_for_serialization(:id) + if !option(:include) && associated_object.respond_to?(:pluck) + associated_object.pluck(:id) + else + associated_object.map do |item| + item.read_attribute_for_serialization(:id) + end end end end @@ -161,15 +164,19 @@ module ActiveModel end def serialize_ids - object = associated_object - - if object && polymorphic? - { - :type => polymorphic_key, - :id => object.read_attribute_for_serialization(:id) - } - elsif object - object.read_attribute_for_serialization(:id) + if polymorphic? + if associated_object + { + :type => polymorphic_key, + :id => associated_object.read_attribute_for_serialization(:id) + } + else + nil + end + elsif source_serializer.object.respond_to?("#{name}_id") + source_serializer.object.send("#{name}_id") + elsif associated_object + associated_object.read_attribute_for_serialization(:id) else nil end