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

时间:2016-03-23 18:41:23

标签: ruby-on-rails caching haml

我在Rails 4.2.6下的haml中有以下片段,在那里我渲染了一整天的记录,然后移动到第二天。我想使用俄罗斯玩偶缓存来加速页面加载,最多可以渲染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

你能告诉我,我是否走在正确的轨道上?谢谢你。

1 个答案:

答案 0 :(得分:1)

"俄罗斯娃娃缓存"通常意味着当过时的嵌套资源自动缓存其父资源的缓存时的一种缓存(例如,更新故障单信息时,user摘要与ticket摘要一起过时。

我不确定你以后是否会添加一定程度的嵌套(为模型关系设置touch: true需要更多的努力),但现在似乎对我很好:

  1. 每张票都被缓存(Rails会根据对象t制作md5);
  2. 只要您在同一天申请门票且结果集未更改,就会显示整个缓存块而不是(1)。
  3. 我能想象的几个问题包括:

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