我已经在我的应用中设置了动作缓存(有扫地机,但我想这里无关紧要),到目前为止除了一件事情之外它的效果很好:
我使用Kaminari进行分页,因此当我对我的操作执行expire_action
时,它只会到达第一页。我知道使用查询字符串指定页面时缓存不起作用,我设置了一个路由,以便将页面附加到url的末尾(例如/ people / 123 / page / 2)。 / p>
如果有必要,我会在这篇文章中添加更多信息,但我猜这里有一些显而易见的东西,所以:有人知道如何使我的其余页面过期吗?
答案 0 :(得分:5)
我仍然对我原来问题的答案感兴趣,如果出现解决方案,我会改变我接受的答案。也就是说,我最终只是通过检查页面是否被指定来缓存原始页面:
caches_action:index,:if => Proc.new {params [:page] .nil? }
答案 1 :(得分:1)
这是我想到的解决方案,面临同样的问题,但还没有实现。将实际的到期时间缓存在自己的密钥中。密钥将是搜索URL的规范表示,即没有“页面”参数。 e.g:
用户在http://example.com?q=foo&page=3上搜索,因此params为{ q: 'foo', page: 3 }
。删除“page = 3”,我们留下{q:'foo'}。
在其上运行to_param
并添加一些前缀,我们留下了search_expiry_q=foo
等缓存密钥。
查找此规范查询的缓存,即Rails.cache.read(search_expiry_q=foo
)。如果存在,我们将在此时使结果到期。不幸的是,我们只有expires_in
,而不是expires_at
,因此我们必须进行计算。即expires_in: expiry_time - Time.now - 5.seconds
之类的东西(5秒有希望防止任何竞争条件)。我们以这种方式缓存完整的URL / params。
OTOH如果没有到期,那么最近没有人进行搜索。所以我们这样做:
expiry_time = Time.now + 1.hour
Rails.cache.write(`search_expiry_q=foo`, expiry_time, expires_in: 1.hour)
再次使用完整的URL / params和expires_in:1.hour缓存此片段/页面。