为什么需要在控制器中声明缓存清扫器?

时间:2012-05-09 18:05:16

标签: ruby-on-rails ruby caching observer-pattern action-caching

缓存清理程序是一个观察者,它正在观察的模型上有一些钩子:

class MySweeper < ActionController::Caching::Sweeper
  observe MyModel

  def after_update(my_model)
    expire_page(...)
  end
end

但文档和指南也说要在控制器中声明清扫器:

class ApplicationController < ActionController::Base
  cache_sweeper :my_sweeper
end

这是为什么?观察者不是观察模型并采取行动吗?控制器不应该知道缓存何时到期或导致什么原因?

澄清

我对将扫地机设置为观察者的理解是,它意味着“在所有情况下,当更新MyModel时,运行此清理代码”

  1. 这是准确的吗?
  2. 如果是这样,为什么cache_sweeper :my_sweeper也需要在控制器中声明?那是做什么的?

1 个答案:

答案 0 :(得分:1)

来自缓存清扫器文档:

  

扫地机是缓存世界的终结者并负责   模型对象更改时到期缓存。

     

他们通过半观察者,半过滤器和两个角色的回调来实现这一目标。

Sweeper使用控制器使缓存失效,获取缓存设置等。看看source code。因此,缓存清扫器允许我们从控制器端控制缓存。我认为这很好,因为我们可以在任何事件上过期缓存 - 更改数据库或用户登录,或其他任何事情。

我认为,如果您不想在控制器中调用cache_sweeper方法,则可以在清扫器中定义controller方法。我没有测试下面的代码,但它应该可以工作,因为我在扫描器规范中做了同样的事情。

class MySweeper < ActionController::Caching::Sweeper
  observe MyModel

  def after_update(my_model)
    expire_page(...)
  end

  def controller
    @controller ||= ActionController::Base.new
  end
end