🪬
【Rails】変更前と変更後のデータを取得する
Dirty モジュール
データの更新があった時に変更したことの検知や、変更前と変更後のデータを取得したいという場面がありました。
ActiveModel::Dirty
モジュールを使うと、オブジェクトで変更があったかどうかを検出でき、また変更前と変更後のデータも取得できます。
user = User.new
user.changed? # => false
user.name = "Tom"
user.name # => "Tom"
# 属性が1つ以上変更されている場合にtrueを返す
user.changed? # => true
# 保存前に変更された属性のリストを返す
user.changed # => ["Tom"]
# 元の値から変更された属性のハッシュを返す
user.changed_attributes # => {"Tom"=>nil}
# 変更のハッシュを返す (ハッシュのキーは属性名、ハッシュの値はフィールドの新旧の値の配列
user.changes # => {"name"=>[nil, "Tom"]}
# 特定の属性が変更されている場合にtrueを返す
user.name_changed? # => true
user.age_changed? # => false
# 特定の属性の変更前の値を返す
user.name_was # => nil
user.name = "Jun"
user.name_was # => "Tom"
# 変更された属性の、変更前と変更後の値を配列で返す。変更が無い場合はnilを返す
user.name_change # => ["Tom", "Jun"]
user.age_change # => nil
参考記事
Discussion