ActiveRecordでデータを更新後に任意のカラムのデータが更新されたかを知る方法
ActiveRecordで更新後に更新前の値を取得する - まっしろけっけ
以前上記のブログで紹介した内容なのですが、
カラムのデータが更新される前の値が知りたいのではなく、
カラムが更新されたかをどうかのみを知りたい場合にもっと便利なmethodがあったよ。
class User < ActiveRecord::Base def change_name # 何かしらの処理 end end
上記のような前回と似たようなmodelを使用して説明します。
下記のコードのような処理が行われnameが変更された場合のみ
change_nameメソッドを呼びたい
user = User.find(1) user.name = "hoge" user.save!
columnname_changed?を使用すると変更前の値を取得出来る
今回はnameカラムが変更されたか知りたいのでname_changed?を使用します。
下記の様にafter_updateで判定を追加してみる
class User < ActiveRecord::Base after_update do change_name if name_changed? end private def change_name p "hoge" end end
これで先ほどの様にfindからsave!まで行うとchange_nameが呼ばれhogeが出力されているかと思います
sexのみを変更してもchange_nameは呼ばれないと思います
誤解を招きそうだったので追記
user = User.find(1) user.name = "hoge" user.name_changed? # true user.save! user.name_changed? # false
上記のようになるのでafter_update等のcallbackで使用する際はchanged?で変更されたかを確認出来ますが
callback外ではsave後は判定には使用出来ませんので注意を