Skip to content

Commit fa7b3af

Browse files
committed
Prefer explicitly yielding the serializer, per groyoh
1 parent ae6805e commit fa7b3af

File tree

4 files changed

+29
-5
lines changed

4 files changed

+29
-5
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
Breaking changes:
44

55
Features:
6+
- [#1633](https://github.com/rails-api/active_model_serializers/pull/1633) Yield 'serializer' to serializer association blocks. (@bf4)
67
- [#1616](https://github.com/rails-api/active_model_serializers/pull/1616) SerializableResource handles no serializer like controller. (@bf4)
78
- [#1618](https://github.com/rails-api/active_model_serializers/issues/1618) Get collection root key for
89
empty collection from explicit serializer option, when possible. (@bf4)

docs/general/serializers.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,18 @@ has_one :blog, key: :site
4848
has_one :maker, virtual_value: { id: 1 }
4949
```
5050

51+
``ruby
52+
has_one :blog do |serializer|
53+
serializer.cached_blog
54+
end
55+
56+
def cached_blog
57+
cache_store.fetch("cached_blog:#{object.updated_at}") do
58+
Blog.find(object.blog_id)
59+
end
60+
end
61+
```
62+
5163
#### ::has_many
5264
5365
e.g.

lib/active_model/serializer/reflection.rb

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,25 @@ def include_data(value = true)
5656
:nil
5757
end
5858

59+
# @param serializer [ActiveModel::Serializer]
60+
# @yield [ActiveModel::Serializer]
61+
# @return [:nil, associated resource or resource collection]
62+
# @example
63+
# has_one :blog do |serializer|
64+
# serializer.cached_blog
65+
# end
66+
#
67+
# def cached_blog
68+
# cache_store.fetch("cached_blog:#{object.updated_at}") do
69+
# Blog.find(object.blog_id)
70+
# end
71+
# end
5972
def value(serializer)
6073
@object = serializer.object
6174
@scope = serializer.scope
62-
# Add '@serializer' to binding for use in association block as 'serializer'
63-
@serializer = serializer
6475

6576
if block
66-
block_value = instance_eval(&block)
77+
block_value = instance_exec(serializer, &block)
6778
if block_value == :nil
6879
serializer.read_attribute_for_serialization(name)
6980
else
@@ -119,7 +130,7 @@ def build_association(subject, parent_serializer_options)
119130

120131
protected
121132

122-
attr_accessor :object, :scope, :serializer
133+
attr_accessor :object, :scope
123134

124135
private
125136

test/adapter/json_api/relationships_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class RelationshipAuthorSerializer < ActiveModel::Serializer
3838
end
3939
end
4040

41-
has_many :roles do
41+
has_many :roles do |serializer|
4242
meta count: object.posts.count
4343
serializer.cached_roles
4444
end

0 commit comments

Comments
 (0)