From 516f5bdcebc3d501610909bc253c8d67d319b8b0 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Wed, 14 Aug 2013 19:45:05 -0300 Subject: [PATCH] Implement has_one's embed ids include true --- lib/active_model/serializer.rb | 3 ++- lib/active_model/serializer/associations.rb | 7 ++++++- .../active_model/serializer/has_one_test.rb | 18 ++++++++++++++++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index ed8c9a65..c7889407 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -74,7 +74,8 @@ module ActiveModel self.class._associations.each_with_object({}) do |association, hash| if association.embed_ids? hash[association.key] = serialize_ids association - elsif association.embed_objects? + end + if association.embed_objects? associated_data = send(association.name) hash[association.embedded_key] = association.build_serializer(associated_data).serializable_hash end diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index acded95f..e04ca09e 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -13,7 +13,8 @@ module ActiveModel @serializer_class = serializer.is_a?(String) ? serializer.constantize : serializer end - attr_reader :name, :embed_ids, :embed_objects, :embed_key, :include + attr_reader :name, :embed_ids, :embed_objects, :embed_key + attr_accessor :include alias embed_ids? embed_ids alias embed_objects? embed_objects alias include? include @@ -23,6 +24,10 @@ module ActiveModel @embed_objects = embed == :object || embed == :objects end + def embed_objects? + @embed_objects || @embed_ids && @include + end + def build_serializer(object) @serializer_class ||= Serializer.serializer_for(object) diff --git a/test/unit/active_model/serializer/has_one_test.rb b/test/unit/active_model/serializer/has_one_test.rb index 43889b2c..ea68d6dd 100644 --- a/test/unit/active_model/serializer/has_one_test.rb +++ b/test/unit/active_model/serializer/has_one_test.rb @@ -7,6 +7,8 @@ module ActiveModel def setup @model = ::Model.new({ :attr1 => 'value1', :attr2 => 'value2', :attr3 => 'value3' }) @model_serializer = AnotherSerializer.new(@model) + @model_serializer.class._associations[0].include = false + @model_serializer.class._associations[0].embed = :ids end def test_associations_definition @@ -18,14 +20,12 @@ module ActiveModel end 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_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) @@ -44,6 +44,20 @@ module ActiveModel 'attr2' => 'value2', 'attr3' => 'value3', 'model' => { 'attr1' => 'v1', 'attr2' => 'v2' } }, @model_serializer.as_json) end + + def test_associations_embedding_ids_including_objects_serialization_using_serializable_hash + @model_serializer.class._associations[0].include = true + assert_equal({ + 'attr2' => 'value2', 'attr3' => 'value3', 'model_id' => @model.model.object_id, 'model' => { 'attr1' => 'v1', 'attr2' => 'v2' } + }, @model_serializer.serializable_hash) + end + + def test_associations_embedding_ids_including_objects_serialization_using_as_json + @model_serializer.class._associations[0].include = true + assert_equal({ + 'attr2' => 'value2', 'attr3' => 'value3', 'model_id' => @model.model.object_id, 'model' => { 'attr1' => 'v1', 'attr2' => 'v2' } + }, @model_serializer.as_json) + end end end end