ActiveRecord のコールバック

実装の仕方

class Hoge < ActiveRecord::Base
  def before_save
  end
end
  • ブロック
class Hoge < ActiveRecord::Base
  before_save do |model|
  end
end
  • メソッドシンボル
class Hoge < ActiveRecord::Base
  before_save :foobar

  protected
  def foobar
  end
end
  • コールバックオブジェクト

コールバックオブジェクトは普通、app/modelsに置く。

class SinkEvents
  def before_validation(model)
  end
  def before_save(model)
  end
  def bofore_create(model)
  end
end

class Hoge < ActiveRecord::Base
  sink = SinkEvents.new
  before_save sink
  before_save sink
  before_create sink
end
  • オブザーバ

オブザーバは普通、app/modelsに置く。

class HogeObserver < ActiveRecord::Observer
  def before_save(model)
  end
end

または

class XxxObserver < ActiveRecord::Observer
  observe Hoge, Huga
  def before_save(model)
  end
end

config/environment.rbで、
config.active_record.observers = :hoge_observer, :xxx_observer

コールバックチェーン

  • validation, validation_on_create, validation_on_update, save, create, update, destroy に対してそれぞれ before, after がある。あと、after_find, after_initialize。
  • コールバックチェーンを抜けるには、false を返す。(nilではダメ)
  • コールバックチェーンを抜けると、あとのチェーンは実行されない。