前章では、データベース的な制約(default, null) を扱いました。
本章は、Rails のモデル的な制約です。
書式: validates (カラム名) (条件)
条件:
validates :enabled, inclusion: [true, false]format: { with: /正規表現/ }
正規表現と一致すればOK。そうでなければエラー。
uniqueness true
同じカラムの中で、同値のデータが無ければOK。そうでなければエラー。
validates :name, presence: true, uniqueness: { scope: :floor_id }条件は、複数並べることも可。
validates :name, presence: true, uniqueness: true
参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/056f434
サンプルプログラム cabinet.rb の
validates :name, presence: true, uniqueness: { scope: :floor_id }
のように、複数カラムの組み合わせで validates する場合は、
データベース的な制約も併せて実施しておくと良いでしょう。
add_index :cabinets, [:floor_id, :name], unique: true詳細は、
参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/48ef607
を参照してください。
Rails モデルの validates だけだと不足するのは、
二人の人が同時に、同じ name と floor_id のペアを指定してデータを登録するケースへの強度です。
validates はデータを保存する前に走ります。
validates する段階ではデータベースに同じデータは無いので、OK です。
結果、そのまま保存されてしまう危険が残ります。
データベース的にも制約を課していれば、
少なくとも、どちらか一人のデータしか登録できないことが保証されます。
モデル側の制約は WEB UI 的に役立つので、
両方入れておくべきかと思います。