6

我已经在我的应用程序中设置了动作缓存(使用清扫器,但我想这在这里无关紧要),到目前为止它工作得很好,除了一件事:

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

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

4

2 回答 2

5

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

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

于 2012-05-20T06:28:16.453 回答
1

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

用户在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/参数。

OTOH,如果没有过期,那么最近没有人执行搜索。所以我们这样做:

expiry_time = Time.now + 1.hour
Rails.cache.write(`search_expiry_q=foo`, expiry_time, expires_in: 1.hour)

并缓存此片段/页面,再次使用完整的 URL/参数和 expires_in: 1.hour。

于 2012-08-14T18:30:32.053 回答