暇人じゃない

Rails のマイグレーションの timestamps で作成するカラムを NOT NULL にする

マイグレーションで created_atupdated_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 を使わないと定義できないし、勝手にやれってことなのかな。