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メソッドを使って値の変更の有無を変数に持つという方法を取っています。