如何在不知道确切密钥的情况下删除Rails中的一组缓存项?

时间:2012-10-30 16:21:33

标签: ruby-on-rails caching

我有以下问题:

我有一个Products的索引控制器,索引控制器可以有无穷无尽的查询字符串组合,即。

/products?category=5&color=6

现在,通过使用params作为关键字来存储所有这些是很容易的:

caches_action :index, :cache_path => Proc.new { |c| c.params }

当您需要在添加,删除或更改产品时清除所有索引缓存时,会出现此问题。据我所知,您需要知道使缓存对象到期的密钥。你不能在清扫车里做类似的事情:

def after_update(product)
   expire_action(product, :all)
end

我已经研究了缓存标记了一下,但是无法获得我看过的Gems做我需要的东西,或者实际上让它们完全正常工作。我看到的那些宝石是CashierRails-Cache-Tags。我尝试使用Cashier执行以下操作:

caches_action :index, :cache_path => Proc.new { |c| c.params }, :tag => "products"

并在清扫文件中使用:

Cashier.expire "products"

但在使用Cashier尝试任何操作时,会出现以下错误:

uninitialized class variable @@adapter in Cashier

使用rails-cache-tags我尝试过以下操作:

caches_action :index, :cache_path => Proc.new { |c| c.params }, :tags => %w(products)

然后在sweeper文件中使用以下内容:

cache.delete_tag "products"

但这没有用 - 它没有清除缓存。做我正在做的事情的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以拨打expire_fragment,可以将Regexp作为参数:

  

将删除任何匹配的片段,因此%r{pages/\d*/notes}可能会删除所有注释。