From ae6805eacd53b1af1f976af494b039d7d023cd24 Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Wed, 30 Mar 2016 11:03:38 -0500 Subject: [PATCH] Add serializer to association block context --- lib/active_model/serializer/reflection.rb | 4 +++- test/adapter/json_api/relationships_test.rb | 11 +++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/active_model/serializer/reflection.rb b/lib/active_model/serializer/reflection.rb index 701b1b92..5257a905 100644 --- a/lib/active_model/serializer/reflection.rb +++ b/lib/active_model/serializer/reflection.rb @@ -59,6 +59,8 @@ module ActiveModel def value(serializer) @object = serializer.object @scope = serializer.scope + # Add '@serializer' to binding for use in association block as 'serializer' + @serializer = serializer if block block_value = instance_eval(&block) @@ -117,7 +119,7 @@ module ActiveModel protected - attr_accessor :object, :scope + attr_accessor :object, :scope, :serializer private diff --git a/test/adapter/json_api/relationships_test.rb b/test/adapter/json_api/relationships_test.rb index b612a980..bf47a4e5 100644 --- a/test/adapter/json_api/relationships_test.rb +++ b/test/adapter/json_api/relationships_test.rb @@ -40,6 +40,7 @@ module ActiveModel has_many :roles do meta count: object.posts.count + serializer.cached_roles end has_one :blog do @@ -60,6 +61,12 @@ module ActiveModel end meta liked: object.likes.any? end + + def cached_roles + [ + Role.new(id: 'from-serializer-method') + ] + end end def setup @@ -67,7 +74,7 @@ module ActiveModel @blog = Blog.new(id: 1337, name: 'extra') @bio = Bio.new(id: 1337) @like = Like.new(id: 1337) - @role = Role.new(id: 1337) + @role = Role.new(id: 'from-record') @profile = Profile.new(id: 1337) @location = Location.new(id: 1337) @reviewer = Author.new(id: 1337) @@ -144,7 +151,7 @@ module ActiveModel def test_relationship_meta expected = { - data: [{ id: '1337', type: 'roles' }], + data: [{ id: 'from-serializer-method', type: 'roles' }], meta: { count: 1 } } assert_relationship(:roles, expected)