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

How to cache an array using Active Model Serializers (0.8)?

在单个活动模型序列化器上,您可以在序列化器中指定缓存键,即

使用 AMS 缓存单个对象

class OrgSerializer < ActiveModel::Serializer
  cached 
  delegate :cache_key, to: :object
end

数组缓存

我需要传递这些对象的数组:

array_json = ActiveModel::ArraySerializer.new(Org.all.limit(50)).to_json

我不想进行 50 次缓存命中来构建数组,而是进行一次缓存命中并在任何数组元素过期时将其过期。

如何缓存数组(并构造key)?

因此,我想要一个由各个对象 ID 及其最后更新日期组成的数组的缓存键,如下所示:

def cache_key_for_collection collection
  keys = collection.collect{|element| "#{element.id}#{element.updated_at}" }
  keys.join ""
end

如何使用 AMS (0.8) 执行此操作?

AMS 数组序列化程序是否允许这样做,或者它是否需要手动完成?有没有办法声明您想要缓存以及应该如何构造密钥?

如果它不这样做,那么手动构建 cache/key 的最巧妙方法是什么?

它的工作方式与标准序列化程序非常相似。您将创建一个如下所示的自定义 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