LoginSignup
2
2

More than 3 years have passed since last update.

Rails データ内容の制限

Posted at

データの内容を制限する

NOT NULL制約

すでに作成してあるhogeテーブルのnameカラムにNOT NULL制約をつける場合。

ターミナル
$ rails g migration ChangeHogesNameNotNull
Running via Spring preloader in process 6959
      invoke  active_record
      create    db/migrate/xxxxxxxxxxx_change_hoges_name_not_null.rb

マイグレーションファイルが生成されたらそのファイルの中身を編集する。

db/migrate/xxxxxxxxxxx_change_hoges_name_not_null.rb
class ChangeHogesNameNotNull < ActiveRecord::Migration[5.2]
  def change
    change_column_null :hoges, :name, false
  end
end

編集したら、マイグレーションファイルをデータベースに適用する。

ターミナル
$ rails db:migrate

これで、データベースにおいて、hogesテーブルのnameカラムにNULLを入れることができなくなった。
しかし、今の状態だと、""のような空文字を保存できてしまう。この対応の仕方は、hoge.rbの方でバリデーションを記述すれば良い。記述方法は割愛。

NOT NULL制約を加えることでどうなるかRailsコンソールで確認する

ターミナル
$ rails c
Running via Spring preloader in process 7167
Loading development environment (Rails 5.2.3)
>> Hoge.new(name: nil).save
   (0.3ms)  BEGIN
  Hoge Create (27.2ms)  INSERT INTO "hoges" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id"  [["created_at", "2019-11-12 05:35:19.735447"], ["updated_at", "2019-11-12 05:35:19.735447"]]
   (0.2ms)  ROLLBACK
Traceback (most recent call last):
        1: from (irb):1
ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR:  null value in column "name" violates not-null constraint)
DETAIL:  Failing row contains (7, null, null, 2019-11-12 05:35:19.735447, 2019-11-12 05:35:19.735447).
: INSERT INTO "hoges" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id"
>> 

ActiveRecord::NotNullViolationという例外が発生し、登録に失敗していることがわかる。

2
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
2
2