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
enddb: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
endPostgreSQL で確認:
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 を使わないと定義できないし、勝手にやれってことなのかな。