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

我已经在我的应用程序中设置了动作缓存(使用清扫器,但我认为这与此无关),到目前为止,除了一件事之外它的效果很好:

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

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

我仍然对我原来问题的答案感兴趣,如果出现解决方案,我会改变我接受的答案。 也就是说,我最终只通过检查页面是否被指定来缓存原始页面:

caches_action:index,:if => Proc.new {params [:page] .nil? }

这是我想到的解决方案,面临同样的问题,但尚未实现。 将实际的到期时间缓存在自己的密钥中。 密钥将是搜索URL的规范表示,即没有“页面”参数。 例如:

用户在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缓存此片段/页面。