まっしろけっけ

めもてきなやーつ

ActiveRecordで更新後に更新前の値を取得する

特定のカラムの値が変更された場合のみに
実行したい処理がある場合等に便利です。

class User < ActiveRecord::Base
  attr_accessible :name, :sex, :birthday

  def change_name
    # 何かしらの処理
  end
end

このようなmodelがあり、
下記のコードのような処理が行われnameが変更された場合のみ
change_nameメソッドを呼びたい

user = User.find(1)
user.name = "hoge"
user.save!
columnname_wasを使用すると変更前の値を取得出来る

今回はnameカラムが変更されたか知りたいのでname_wasを使用します。
下記の様にafter_updateで判定を追加してみる

class User < ActiveRecord::Base
  attr_accessible :name, :sex, :birthday

  after_update do 
    change_name unless name == name_was
  end

  private
  def change_name
    p "hoge"
  end
end

これで先ほどの様にfindからsave!まで行うとchange_nameが呼ばれhogeが出力されているかと思います。