diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 1bacab29..5a46858b 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -133,8 +133,7 @@ end if association.embed_ids? hash[association.key] = serialize_ids association elsif association.embed_objects? - associated_data = send(association.name) - hash[association.embedded_key] = serialize(association, associated_data) + hash[association.embedded_key] = serialize association end end end @@ -150,14 +149,14 @@ end associations.each_with_object({}) do |(name, association), hash| if included_associations.include? name if association.embed_in_root? - associated_data = Array(send(association.name)) - hash[association.root_key] = serialize(association, associated_data) + hash[association.root_key] = serialize association end end end end - def serialize(association, object) + def serialize(association) + object = send(association.name) association.build_serializer(object, scope: scope).serializable_object end @@ -174,6 +173,7 @@ end return nil if object.nil? hash = attributes hash.merge! associations + @options[:_wrap_in_array] ? [hash] : hash end alias_method :serializable_object, :serializable_hash end diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 0c961fbc..65e06259 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -38,13 +38,6 @@ module ActiveModel @serializer_class.new(object, options.merge(@options)) end - private - - def use_array_serializer! - @options.merge!(each_serializer: @serializer_class) - @serializer_class = ArraySerializer - end - class HasOne < Association def initialize(name, *args) super @@ -53,12 +46,8 @@ module ActiveModel end def build_serializer(object, options = {}) - if object.respond_to?(:to_ary) && !(@serializer_class && @serializer_class <= ArraySerializer) - use_array_serializer! - else - @serializer_class ||= Serializer.serializer_for(object) || DefaultSerializer - end - + @serializer_class ||= Serializer.serializer_for(object) || DefaultSerializer + options[:_wrap_in_array] = embed_in_root? super end end @@ -72,7 +61,8 @@ module ActiveModel def build_serializer(object, options = {}) if @serializer_class && !(@serializer_class <= ArraySerializer) - use_array_serializer! + @options[:each_serializer] = @serializer_class + @serializer_class = ArraySerializer else @serializer_class ||= ArraySerializer end diff --git a/test/unit/active_model/serializer/associations/build_serializer_test.rb b/test/unit/active_model/serializer/associations/build_serializer_test.rb index c2d84efc..eb0cf86f 100644 --- a/test/unit/active_model/serializer/associations/build_serializer_test.rb +++ b/test/unit/active_model/serializer/associations/build_serializer_test.rb @@ -11,11 +11,8 @@ module ActiveModel def test_build_serializer_for_array_called_twice 2.times do - serializer = @association.build_serializer([@post]) - each_serializer = serializer.serializer_for(@post) - - assert_instance_of(ArraySerializer, serializer) - assert_instance_of(PostSerializer, each_serializer) + serializer = @association.build_serializer(@post) + assert_instance_of(PostSerializer, serializer) end end end