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は、コントローラーを使用してキャッシュを期限切れにしたり、キャッシュ設定を取得したりします。ソースコードを確認してください。したがって、キャッシュスイーパーを使用すると、コントローラー側からキャッシュを制御できます。そして、これは良いことだと思います。なぜなら、DBの変更やユーザーのサインインなど、あらゆるイベントでキャッシュを期限切れにすることができるからです。

コントローラーでメソッドを呼び出したくない場合は、スイーパーでメソッドを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 に答える