Prefer explicitly yielding the serializer, per groyoh

This commit is contained in:
Benjamin Fleischer 2016-03-30 13:35:17 -05:00
parent ae6805eacd
commit fa7b3afbfd
4 changed files with 29 additions and 5 deletions

View File

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

View File

@ -48,6 +48,18 @@ has_one :blog, key: :site
has_one :maker, virtual_value: { id: 1 }
```
``ruby
has_one :blog do |serializer|
serializer.cached_blog
end
def cached_blog
cache_store.fetch("cached_blog:#{object.updated_at}") do
Blog.find(object.blog_id)
end
end
```
#### ::has_many
e.g.

View File

@ -56,14 +56,25 @@ module ActiveModel
:nil
end
# @param serializer [ActiveModel::Serializer]
# @yield [ActiveModel::Serializer]
# @return [:nil, associated resource or resource collection]
# @example
# has_one :blog do |serializer|
# serializer.cached_blog
# end
#
# def cached_blog
# cache_store.fetch("cached_blog:#{object.updated_at}") do
# Blog.find(object.blog_id)
# end
# end
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)
block_value = instance_exec(serializer, &block)
if block_value == :nil
serializer.read_attribute_for_serialization(name)
else
@ -119,7 +130,7 @@ module ActiveModel
protected
attr_accessor :object, :scope, :serializer
attr_accessor :object, :scope
private

View File

@ -38,7 +38,7 @@ module ActiveModel
end
end
has_many :roles do
has_many :roles do |serializer|
meta count: object.posts.count
serializer.cached_roles
end