diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index 10d13b1c..32a382f0 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -46,7 +46,9 @@ module ActiveModel def embedded_in_root_associations @object.each_with_object({}) do |item, hash| serializer_for(item).embedded_in_root_associations.each_pair do |type, objects| - if hash[type] + next if !objects || objects.flatten.empty? + + if hash.has_key?(type) hash[type].concat(objects).uniq! else hash[type] = objects diff --git a/test/unit/active_model/array_serializer/serialization_test.rb b/test/unit/active_model/array_serializer/serialization_test.rb index bee1c4c4..51f2731a 100644 --- a/test/unit/active_model/array_serializer/serialization_test.rb +++ b/test/unit/active_model/array_serializer/serialization_test.rb @@ -144,6 +144,39 @@ module ActiveModel ensure UserSerializer._associations[:profile] = @old_association end + + def test_embed_object_in_root_for_has_one_association_with_all_nil_values + @association = UserSerializer._associations[:profile] + @old_association = @association.dup + + @association.embed = :ids + @association.embed_in_root = true + + @user1 = User.new({ name: 'User 1', email: 'email1@server.com' }) + @user2 = User.new({ name: 'User 2', email: 'email2@server.com' }) + + class << @user1 + def profile + nil + end + end + + class << @user2 + def profile + nil + end + end + + @serializer = ArraySerializer.new([@user1, @user2], root: :users) + assert_equal({ + users: [ + { name: "User 1", email: "email1@server.com", 'profile_id' => nil }, + { name: "User 2", email: "email2@server.com", 'profile_id' => nil } + ] + }, @serializer.as_json) + ensure + UserSerializer._associations[:profile] = @old_association + end end end end