Rails缓存:为一个操作过期多个页面

时间:2012-05-19 13:47:56

标签: ruby-on-rails ruby-on-rails-3 caching pagination kaminari

我已经在我的应用中设置了动作缓存(有扫地机,但我想这里无关紧要),到目前为止除了一件事情之外它的效果很好:

我使用Kaminari进行分页,因此当我对我的操作执行expire_action时,它只会到达第一页。我知道使用查询字符串指定页面时缓存不起作用,我设置了一个路由,以便将页面附加到url的末尾(例如/ people / 123 / page / 2)。 / p>

如果有必要,我会在这篇文章中添加更多信息,但我猜这里有一些显而易见的东西,所以:有人知道如何使我的其余页面过期吗?

2 个答案:

答案 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缓存此片段/页面。