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のキャッシュストアを使うようになると登場がなくなりそうですが・・