まっしろけっけ

めもてきなやーつ

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後は判定には使用出来ませんので注意を