diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index ea3b4b6c..ed8c9a65 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -75,8 +75,8 @@ module ActiveModel if association.embed_ids? hash[association.key] = serialize_ids association elsif association.embed_objects? - # TODO - hash + associated_data = send(association.name) + hash[association.embedded_key] = association.build_serializer(associated_data).serializable_hash end end end diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index a8bb4167..acded95f 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -37,6 +37,10 @@ module ActiveModel def key "#{name}_id" end + + def embedded_key + name + end end end end diff --git a/test/unit/active_model/serializer/has_one_test.rb b/test/unit/active_model/serializer/has_one_test.rb index 652ed3e4..43889b2c 100644 --- a/test/unit/active_model/serializer/has_one_test.rb +++ b/test/unit/active_model/serializer/has_one_test.rb @@ -17,19 +17,33 @@ module ActiveModel assert_equal 'model', associations[0].name end - def test_associations_serialization_using_serializable_hash + def test_associations_embedding_ids_serialization_using_serializable_hash @model_serializer.class._associations[0].embed = :ids assert_equal({ 'attr2' => 'value2', 'attr3' => 'value3', 'model_id' => @model.model.object_id }, @model_serializer.serializable_hash) end - def test_associations_serialization_using_as_json + def test_associations_embedding_ids_serialization_using_as_json @model_serializer.class._associations[0].embed = :ids assert_equal({ 'attr2' => 'value2', 'attr3' => 'value3', 'model_id' => @model.model.object_id }, @model_serializer.as_json) end + + def test_associations_embedding_objects_serialization_using_serializable_hash + @model_serializer.class._associations[0].embed = :objects + assert_equal({ + 'attr2' => 'value2', 'attr3' => 'value3', 'model' => { 'attr1' => 'v1', 'attr2' => 'v2' } + }, @model_serializer.serializable_hash) + end + + def test_associations_embedding_objects_serialization_using_as_json + @model_serializer.class._associations[0].embed = :objects + assert_equal({ + 'attr2' => 'value2', 'attr3' => 'value3', 'model' => { 'attr1' => 'v1', 'attr2' => 'v2' } + }, @model_serializer.as_json) + end end end end