暇人じゃない

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

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

About

chocoby (GitHub / Twitter)

フリーのソフトウェア開発者です。 Ruby を使った Web 開発を得意としています。