如何在 Rails 中通过 Russian Doll 缓存集合?

How to cache a collection via Russian Doll in Rails?

我在 Rails 4.2.6 下的 haml 中有以下代码片段,我在其中渲染了一天的记录,然后转到第二天。我想使用 Russian Doll 缓存来加快页面加载速度,最多渲染 300 张票,但我不确定如何为集合创建缓存键--

@tickets.where(calendar_date: day).order(:calendar_order) 的缓存键?

然后我需要缓存个人门票。请考虑一下,当我在这里寻求帮助时,我有点困惑。因此,如果我的问题似乎不清楚,请让我澄清是否需要。

请注意,day 变量在代码的前面递增。

.row(data-row-date="#{ day }")
  - @tickets.where(calendar_date: day).order(:calendar_order).each do |t|
    - cache(t) do 
      # code for each job ticket

更新

下面的代码比我之前的尝试效果更好,但我不确定它是否准确,密钥是否会正确过期。

.row(data-row-date="#{ day }")
  - tickets = @tickets.where(calendar_date: day).order(:calendar_order)
  - cache(["day-#{day}", tickets.map(&:id), tickets.maximum(:updated_at)]) do
    - tickets.each do |t|
      - cache(t) do

你能告诉我我的方向是否正确吗?谢谢你。

"Russian doll caching" 通常意味着当过时的嵌套资源自动使其父资源的缓存失效时的一种缓存(例如,当票证信息更新时,user 摘要与 ticket 摘要一起过时).

我不确定您以后是否要添加一定程度的嵌套(为模型关系设置 touch: true 需要更多的努力),但目前看来还不错对我来说:

  1. 每张票都被缓存(Rails 将根据对象制作 md5 t);
  2. 只要您请求当天的票并且您的结果集没有改变,您就会显示整个缓存块而不是 (1)。

我能想到的几个问题包括:

  1. 不同的时区。如果您的 calendar_date 实际上是 Date,来自全球不同地区的用户可能希望根据他们的实际日期而不是基于服务器的日期获得结果;
  2. 请注意,ActiveRecord 在使用 update_all 时不会更新时间戳字段 (updated_at/updated_on)。小心做类似 Ticket.update_all(params) 的事情,因为它不会使您的缓存摘要无效。