Caching
To cache a serializer, call cache
and pass its options. The options are the same
options of ActiveSupport::Cache::Store
, plus a key
option that will be the prefix
of the object cache on a pattern "#{key}/#{object.id}-#{object.updated_at}"
.
The cache support is optimized to use the cached object in multiple request. An object cached on a show
request will be reused at the index
. If there is a relationship with another cached serializer it will also be created and reused automatically.
Every object is individually cached.
The cache is automatically expired after an object is updated, but it's not deleted.
cache(options = nil) # options: ```{key, expires_in, compress, force, race_condition_ttl}
Take the example bellow:
```ruby
class PostSerializer < ActiveModel::Serializer
cache key: 'post', expires_in: 3.hours
attributes :title, :body
has_many :comments
end
On this example every Post
object will be cached with the key
"post/#{post.id}-#{post.updated_at}"
. You can use this key to expire it as
you want, but in this case it will be automatically expired after 3 hours.
Fragment Caching
If there is some API endpoint that shouldn't be fully cached, you can still optimise it, using Fragment Cache on the attributes and relationships that you want to cache.
You can define the attribute by using only
or except
option on cache method.
[NOTE] Cache serializers will be used at their relationships
Example:
class PostSerializer < ActiveModel::Serializer
cache key: 'post', expires_in: 3.hours, only: [:title]
attributes :title, :body
has_many :comments
end
Methods
::cache
e.g.
cache key: 'post', expires_in: 0.1, skip_digest: true
cache expires_in: 1.day, skip_digest: true
cache key: 'writer', skip_digest: true
cache only: [:name], skip_digest: true
cache except: [:content], skip_digest: true
cache key: 'blog'
cache only: [:id]
#cache_key
e.g.
# Uses a custom non-time-based cache key
def cache_key
"#{self.class.name.downcase}/#{self.id}"
end