From d3d6c981487ed1cadef6247c85008a6f538270ec Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Thu, 31 Oct 2013 17:28:39 -0200 Subject: [PATCH] Make ArraySerializer reuse Serializer embedded_in_root_associations code --- lib/active_model/array_serializer.rb | 29 ++++++++++------------------ lib/active_model/serializable.rb | 12 ++++++++---- lib/active_model/serializer.rb | 4 ---- 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index 62f6e535..157f8192 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -30,34 +30,25 @@ module ActiveModel end end + def serializer_for(item) + serializer_class = @each_serializer || Serializer.serializer_for(item) || DefaultSerializer + serializer_class.new(item, @options) + end + def serializable_array @object.map do |item| - serializer = @each_serializer || Serializer.serializer_for(item) || DefaultSerializer - serializer.new(item, @options).serializable_object + serializer_for(item).serializable_object end end alias_method :serializable_object, :serializable_array - def serializable_data - embedded_in_root_associations.merge!(super) - end - def embedded_in_root_associations - hash = {} - @object.map do |item| - serializer_class = @each_serializer || Serializer.serializer_for(item) || DefaultSerializer - associations = serializer_class._associations - serializer = serializer_class.new(item, @options) - included_associations = serializer.filter(associations.keys) - associations.each do |(name, association)| - if included_associations.include? name - if association.embed_in_root? - hash[association.embedded_key] = serializer.serialize association - end - end + @object.each_with_object({}) do |item, hash| + serializer = serializer_for(item) + if serializer.respond_to?(:embedded_in_root_associations) + hash.merge!(serializer.embedded_in_root_associations) end end - hash end end end diff --git a/lib/active_model/serializable.rb b/lib/active_model/serializable.rb index c5adb684..7a34bc04 100644 --- a/lib/active_model/serializable.rb +++ b/lib/active_model/serializable.rb @@ -11,11 +11,15 @@ module ActiveModel end def serializable_data - if respond_to?(:meta) && meta - { meta_key => meta } - else - {} + embedded_in_root_associations.tap do |hash| + if respond_to?(:meta) && meta + hash[meta_key] = meta + end end end + + def embedded_in_root_associations + {} + end end end diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 6bdb48e5..4e215545 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -141,10 +141,6 @@ end keys end - def serializable_data - embedded_in_root_associations.merge!(super) - end - def embedded_in_root_associations associations = self.class._associations included_associations = filter(associations.keys)