From 0948c4199a46bfc6d8172badfc67922bfbc23b67 Mon Sep 17 00:00:00 2001 From: Lucas Hosseini Date: Sat, 31 Oct 2015 19:20:53 +0100 Subject: [PATCH] Compute only requested attributes. --- lib/active_model/serializer.rb | 7 +++---- lib/active_model/serializer/adapter/attributes.rb | 5 +---- lib/active_model/serializer/adapter/json_api.rb | 3 +-- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 2d0027d9..2f55d450 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -238,10 +238,9 @@ module ActiveModel # Return the +attributes+ of +object+ as presented # by the serializer. - def attributes - attributes = self.class._attributes.dup - - attributes.each_with_object({}) do |name, hash| + def attributes(requested_attrs = nil) + self.class._attributes.each_with_object({}) do |name, hash| + next unless requested_attrs.nil? || requested_attrs.include?(name) if self.class._fragmented hash[name] = self.class._fragmented.public_send(name) else diff --git a/lib/active_model/serializer/adapter/attributes.rb b/lib/active_model/serializer/adapter/attributes.rb index 15577eb8..49dea860 100644 --- a/lib/active_model/serializer/adapter/attributes.rb +++ b/lib/active_model/serializer/adapter/attributes.rb @@ -57,10 +57,7 @@ module ActiveModel def resource_object_for(options) cache_check(serializer) do - attributes = serializer.attributes - attributes.slice!(*options[:fields]) if options[:fields] - - attributes + serializer.attributes(options[:fields]) end end end diff --git a/lib/active_model/serializer/adapter/json_api.rb b/lib/active_model/serializer/adapter/json_api.rb index 6f43d5f3..962c95be 100644 --- a/lib/active_model/serializer/adapter/json_api.rb +++ b/lib/active_model/serializer/adapter/json_api.rb @@ -140,8 +140,7 @@ module ActiveModel cache_check(serializer) do resource_object = resource_identifier_for(serializer) requested_fields = fieldset && fieldset.fields_for(resource_object[:type]) - attributes = serializer.attributes.except(:id) - attributes.slice!(*requested_fields) if requested_fields + attributes = serializer.attributes(requested_fields).except(:id) resource_object[:attributes] = attributes if attributes.any? resource_object end