LoginSignup
4
2

More than 3 years have passed since last update.

[Rails]モデルのバリデーション「lengthチェック」の閾値はテーブル情報から動的に取得しよう

Last updated at Posted at 2020-11-08

下記のusersテーブルがあるとします。

mysql> desc users;
+-----------------------------+-------------+------+-----+---------+----------------+
| Field                       | Type        | Null | Key | Default | Extra          |
+-----------------------------+-------------+------+-----+---------+----------------+
| id                          | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| name                        | varchar(100)| NO   |     | NULL    |                |
| created_at                  | datetime    | NO   |     | NULL    |                |
| updated_at                  | datetime    | NO   |     | NULL    |                |
+-----------------------------+-------------+------+-----+---------+----------------+

この場合、RailsのUserモデルを作るときにnameには100文字未満というバリデーションを入れることが多いと思います。
そのときに下記のように100とハードコーディングしていませんか?

app/models/user.rb
validates :name, presence: true, length: { maximum: 100 }

Railsではデータベーステーブルのメタ情報を簡単に取得することができます。
これを使うことで下記のように100の部分をテーブル定義から動的に取ることができます。

validates :name, presence: true, length: { maximum: columns.find{|c| c.name == 'name' }.limit }

このように書いておくことでテーブル定義を変更したときも自動的にバリデーションの値も更新されるのでおすすめです。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2