Rails:特定のカラムが更新された時だけコールバックを実行させる
特定のカラムが更新された時だけコールバックを実行したいケースがあり、saved_change_to_*?
メソッドを利用した。
saved_change_to_*
メソッドは特定のカラムが更新されたかどうかを判定するのに使用することができる。
特定のカラムが更新された場合
Userモデルのpointカラムが更新される度に合計を集計する場合のサンプル。
# 前提:Userにpointカラムが定義されている場合 class User < ApplicationRecord after_save sum_total_point, if saved_change_to_point? end
複数のカラムを対象にいずれかが更新された場合
複数のカラムのいずれかを更新したい場合は以下のようにして対応することもできる。
# 前提:Userにstarted_dateカラムとworked_dateカラムが定義されている場合 class User < ApplicationRecord after_save calculate_term, if change_datetime? end def change_datetime? saved_change_to_started_date? || saved_change_to_worked_date? end
特定のカラム更新時にバリデーションを実行したい場合
今まではSave後の処理に対しての判定だったがSave前に対してはwill_save_change_to_*?
を使って対応することもできる。
このケースはAカラムを更新した場合にBカラムとの不整合が起きていないことを検証したい時などに使えそうかな。
参考
- ActiveRecord::AttributeMethods::Dirty モジュールで定義されてる