データの内容を制限する
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という例外が発生し、登録に失敗していることがわかる。