1日1%成長するブログ

毎日成長するために仕事/プライベートで得た学びをアウトプットするブログです

Railsで特定のカラムが更新された時だけバリデーションを実行する

Rails5.1からは特定のカラムが更新されたかどうかは、以下のメソッドで判定するようになった。

Save前

{カラム名}_changed?の代わりにwill_save_change_to_{カラム名}?
{カラム名}_was の代わりに {カラム名}_in_database

Save後

{カラム名}_changed?の代わりにsaved_change_to_{カラム名}?
{カラム名}_was の代わりに {カラム名} _before_last_save

今回はバリデーションなので、Save前のメソッドを使う。

validate :validate_update_hoge, if: :will_save_change_to_hoge?

def validate_update_hoge
  # hoge_in_databaseを使ってバリデーション書く
end

これでカラムが更新された場合のみ、変更前と後の値を使ってバリデーションを書ける。