diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index dfb86844..10d13b1c 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -46,7 +46,7 @@ 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.has_key?(type) + if hash[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 2df9ef08..bee1c4c4 100644 --- a/test/unit/active_model/array_serializer/serialization_test.rb +++ b/test/unit/active_model/array_serializer/serialization_test.rb @@ -108,6 +108,42 @@ module ActiveModel ensure UserSerializer._associations[:profile] = @old_association end + + def test_embed_object_in_root_for_has_one_association_with_nil_value + @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 + @profile ||= Profile.new(name: 'Name 1', description: 'Desc 1') + 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' => @user2.profile.object_id } + ], + 'profiles' => [ + { name: 'Name 1', description: 'Desc 1' } + ] + }, @serializer.as_json) + ensure + UserSerializer._associations[:profile] = @old_association + end end end end