fkm_y' log

技術や日常のログ

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カラムとの不整合が起きていないことを検証したい時などに使えそうかな。

参考