後へ      Topへ      次へ

モデルの validates

前章では、データベース的な制約(default, null) を扱いました。
本章は、Rails のモデル的な制約です。

書式: validates (カラム名) (条件)

条件:

条件は、複数並べることも可。
validates :name, presence: true, uniqueness: true

参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/056f434

データベース的な制約 (index unique)

サンプルプログラム cabinet.rb の
validates :name, presence: true, uniqueness: { scope: :floor_id }
のように、複数カラムの組み合わせで validates する場合は、
データベース的な制約も併せて実施しておくと良いでしょう。

  1. ruby bin/rails g migration AddModelValidates
  2. 生成されたマイグレーションファイルに
    add_index :cabinets, [:floor_id, :name], unique: true
    のように書きます。
  3. ruby bin/rails db:migrate

詳細は、
参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/48ef607
を参照してください。

Rails モデルの validates だけだと不足するのは、
二人の人が同時に、同じ name と floor_id のペアを指定してデータを登録するケースへの強度です。
validates はデータを保存する前に走ります。
validates する段階ではデータベースに同じデータは無いので、OK です。
結果、そのまま保存されてしまう危険が残ります。

データベース的にも制約を課していれば、
少なくとも、どちらか一人のデータしか登録できないことが保証されます。

モデル側の制約は WEB UI 的に役立つので、
両方入れておくべきかと思います。

後へ      Topへ      次へ