Rails界のシティーハンター(Sweeper)
Railsには古くからキャッシュ機構があります。
キャッシュを失効させる便利な機能としてSweeperがあります。古くから
Sweeperはこんなの
class PostsSweeper < ActionController::Caching::Sweeper observe Post def after_save(post) clear_posts_cache(post) end def after_destroy(post) clear_posts_cache(post) end def clear_posts_cache(post) expire_fragment :recent_posts expire_action :controller => :posts, :action => :index expire_page :controller => :posts, :action => :show, :id => post end end
このSweeperを使うときはコントローラーにcache_sweeperで指定するわけですが、あとLOAD_PATHにも突っ込みますが
class PostsController < ApplicationController before_filter :authenticate caches_action :show cache_sweeper :posts_sweeper
SweeperはモデルのObserverとコントローラーのフィルタをドッキングさせた奴なので、なんかすごいです。
- cache_sweeperのコードを追っていったら迷い子になりました
- Observerとコントローラーのフィルタをそれぞれ分けて下調べするべきだった
- ActiveRecordのコールバックって、自分自身のクラスに定義したフィルタを実行したあとにObserverのフィルタを実行するんですね(自分のコールバックをやったあとにnotify_observers)
- というかRubyのobserverライブラリを使ってることを知りませんでした。すいません
- コールバックの総本山はActiveSupport::Callbacks
- ActiveRecordのコールバック(ActiveRecord::Callbacks)は総本山含んだ別途
- ActiveRecordのコールバックのほうがスッキリ。そりゃメソッドが固定されているから
- コントローラーのフィルタメソッドにオブジェクト渡せるの知りませんでした(beforeメソッド、afterメソッドがあるオブジェクト)
Sweeperはmemcachedのキャッシュストアを使うようになると登場がなくなりそうですが・・