如何使用Active Model Serializers(0.8)缓存数组?

时间:2016-04-30 09:31:55

标签: ruby-on-rails caching active-model-serializers

在单个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.8)做到这一点?

AMS阵列序列化器是否允许这样做,还是需要手动完成?有没有办法声明你想要缓存以及如何构造密钥?

如果它没有这样做,那么手动构建缓存/密钥的最佳方法是什么?

1 个答案:

答案 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