🪬

【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

参考記事

https://qiita.com/kamohicokamo/items/b67e6aaf66f59e0917c8

https://railsguides.jp/active_model_basics.html#dirtyモジュール

Discussion