From 386a567dfc5229d6123720b652dbc54ea0a9a5be Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Fri, 4 Dec 2015 13:58:22 -0600 Subject: [PATCH] Evaluate association blocks as scopes on the association --- lib/active_model/serializer/reflection.rb | 10 +++++++++- test/serializers/associations_test.rb | 4 ++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/active_model/serializer/reflection.rb b/lib/active_model/serializer/reflection.rb index e2d16d35..472b2991 100644 --- a/lib/active_model/serializer/reflection.rb +++ b/lib/active_model/serializer/reflection.rb @@ -7,8 +7,16 @@ module ActiveModel # class PostSerializer < ActiveModel::Serializer # has_one :author, serializer: AuthorSerializer # has_many :comments + # has_many :comments, key: :last_comments do + # last(1) + # end # end # + # Notice that the association block is evaluated in the context of the association. + # Specifically, the association 'comments' is evaluated two different ways: + # 1) as 'comments' and named 'comments'. + # 2) as 'comments.last(1)' and named 'last_comments'. + # # PostSerializer._reflections #=> # # [ # # HasOneReflection.new(:author, serializer: AuthorSerializer), @@ -33,7 +41,7 @@ module ActiveModel def self.build_reader(name, block) if block - ->(instance) { instance.instance_eval(&block) } + ->(instance) { instance.read_attribute_for_serialization(name).instance_eval(&block) } else ->(instance) { instance.read_attribute_for_serialization(name) } end diff --git a/test/serializers/associations_test.rb b/test/serializers/associations_test.rb index 81380c7c..ecb671f2 100644 --- a/test/serializers/associations_test.rb +++ b/test/serializers/associations_test.rb @@ -128,8 +128,8 @@ module ActiveModel class InlineAssociationTestPostSerializer < ActiveModel::Serializer has_many :comments - has_many :last_comments do - object.comments.last(1) + has_many :comments, key: :last_comments do + last(1) end end