加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何使用Active Model Serializers(0.8)缓存数

发布时间:2020-12-17 01:56:31 所属栏目:百科 来源:网络整理
导读:在单个Active Model Serializer上,您可以在序列化程序中指定缓存键,即 使用AMS缓存单个对象 class OrgSerializer ActiveModel::Serializer cached delegate :cache_key,to: :objectend 数组缓存 我需要提供这些对象的数组: array_json = ActiveModel::Array
在单个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阵列序列化器是否允许这样做,还是需要手动完成?有没有办法声明你想要缓存以及如何构造密钥?

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

解决方法

它的工作方式与标准的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而不是对象,但这纯粹是如何实现AMS 0.8.0.

然后,为了传递json,你必须做的唯一改变是:array_json = ActiveModel :: ArraySerializer.new(Org.all.limit(50)).to_json

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读