KDOC 690: Railsのモデルのバリデーションは既存のレコードを検査しない

この文書のステータス

  • 作成
    • 2026-10-18 貴島
  • レビュー
    • 2026-10-18 貴島

概要

Railsのモデルのバリデーションは、 save や update でデータベースに送る前のオブジェクトにだけ走る。そのため、あとから presence: true を足しても、すでに NULL が入っているレコードはそのまま残る。そのレコードは、ほかのカラムを直して保存しようとしてもバリデーションで弾かれ、ふつうの save や update では更新できなくなる。

既存のレコードまで守るには、 NULL を直してからデータベースに NOT NULL 制約を付ける。ただし presence: true は空文字列も弾くが、 NOT NULL は空文字列を通すので、同じ守りにはならない。

新規レコードを保存すると、SQLのINSERT操作がデータベースに送信され、既存のレコードを更新すると、SQLのUPDATE操作が送信されます。バリデーションは、これらのコマンドがデータベースに送信される前に実行されるのが普通です。

このバリデータの内部では、属性の値がnilや空白(blank: つまり空文字列“”またはホワイトスペースのみで構成される文字列)であることのチェックにObject#blank?メソッドが使われています。

Active Record バリデーション - Railsガイド

関連

なし。