3

缓存清扫器是一个观察者,在它所观察的模型上带有一些钩子:

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还需要在控制器中声明呢?那有什么作用?
4

1 回答 1

1

来自缓存清扫器文档:

Sweeper 是缓存世界的终结者,负责在模型对象更改时使缓存过期。

他们通过成为半观察者、半过滤器并为这两个角色实现回调来做到这一点。

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

我认为,如果您不想在控制器中调用方法,则可以在清扫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
于 2012-05-09T21:57:12.523 回答