Rails のマイグレーションの timestamps で作成するカラムを NOT NULL にする
マイグレーションで created_at
や updated_at
を定義する時に t.timestamps
と書くことが多いと思うけれど、普通にマイグレーションを流すと NULL
可になる。
Rails に任せておけば NULL
が入ることはないと思うが、NOT NULL
にしておきたい。
マイグレーションでこう書く:
t.timestamps
には引数を渡せる。
def change
create_table :posts do |t|
t.string :title, null: false
t.timestamps null: false
end
end
db:migrate
すると schema.rb
はこうなる:
create_table "posts", force: true do |t|
t.string "title", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
PostgreSQL で確認:
test=> \d posts;
Table "public.posts"
Column | Type | Modifiers
-----------------+-----------------------------+-------------------------------------------------------
id | integer | not null default nextval('posts_id_seq'::regclass)
title | character varying(255) | not null
created_at | timestamp without time zone | not null
updated_at | timestamp without time zone | not null
殆どの場面ではこれらのカラムは NOT NULL
になって良いと思うのだけれど、何か罠があるのだろうか?
外部キー制約も Foreigner を使わないと定義できないし、勝手にやれってことなのかな。