ActiveRecordで値の変更前・後の値を見て処理をしたい場合

テーブルのあるカラムの値が更新された時だけ処理をしたいという場合があると思います。その場合、以下のように[カラム名]_wasで変更前の値がとれます。

class Test < ActiveRecord::Base
  STATUS_SLEEP = 'sleep' 
  STATUS_ACTIVE   = 'active'  

  after_update do
    @change_status= true if status == STATUS_ACTIVE
                         && status_was == STATUS_SLEEP
  end

   attr_reader :change_status
end

注意点は[カラム名]_wasですが、updateが終わった後だと取得できません。

class TestController < ActionController::Base

  def update
    # event.statusがplanningとする
    event = Event.find(params[:id])
    puts event.status_was
    # event.statusをwantedにupdateする
    event.update!(status: Event::STATUS_WANTED)
    puts event.status_was
  end
end

これの出力結果は


planning
wanted

です。
最後の出力がwantedでなくplanningであれば、updateメソッド実行された後でも変更前の値が取得出来て良かったのですが、そういう訳にはいかなかったです。それがあっため最初の例で書いたようにafter_updateメソッドを使って値の変更の有無を変数に持つという方法を取っています。