【Rails】変更前と変更後のデータを取得する

【Rails】変更前と変更後のデータを取得する Ruby / 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
注意

Dirtyモジュールのいくつかのメソッド名が非推奨になったようです。Railsガイドやその他記事を見て使用する際は、以下の記事を確認してから使用してみてください。

参考:Rails 5.1 で attribute_was, attribute_change, attribute_changed?, changed?, changed 等が DEPRECATION WARNING – Qiita

参考記事