在单个Active Model Serializer上,您可以在序列化程序中指定缓存键,即
使用AMS缓存单个对象
class OrgSerializer < ActiveModel::Serializer
cached
delegate :cache_key, to: :object
end
数组缓存
我需要提供这些对象的数组:
array_json = ActiveModel::ArraySerializer.new(Org.all.limit(50)).to_json
而不是执行50次高速缓存命中来构造数组,而不是我想要执行单个高速缓存命中,并在任何数组元素到期时使其到期。
如何缓存数组(并构造密钥)?
因此,我想要一个由各个对象ID组成的数组的缓存键及其最后更新日期,如下所示:
def cache_key_for_collection collection
keys = collection.collect{|element| "#{element.id}#{element.updated_at}" }
keys.join ""
end
AMS阵列序列化器是否允许这样做,还是需要手动完成?有没有办法声明你想要缓存以及如何构造密钥?
如果它没有这样做,那么手动构建缓存/密钥的最佳方法是什么?
答案 0 :(得分:0)
它的工作方式与标准的Serializer非常相似。您将创建一个如下所示的自定义ArraySerializer:
class BaseArraySerializer < ActiveModel::ArraySerializer
cached
def cache_key
keys = object.map{|obj| "#{obj.id}-#{obj.updated_at.to_s(:number)}" }
keys.join "/"
end
端
需要注意的一点是,您仍在使用object.map
而不是objects
,但这纯粹是AMS 0.8.0的实施方式。
然后交付json,你必须做的唯一改变是:
array_json = ActiveModel::ArraySerializer.new(Org.all.limit(50)).to_json