Add timestamptz Columns With The Migration DSL

The Rails migration DSL comes with the t.timestamps method. This allows you to add the created_at and updated_at timestamp columns that are standard for most models in Rails apps.

create_table :posts do |t|
  t.string :title, null: false
  # ...

  t.timestamps
end

With a PostgreSQL database, this will result in a posts table that has created_at and updated_at columns that are of type timestamp(6) without time zone.

I'd prefer to use timestamp columns that include a time zone offset. PostgreSQL supports this with its timestamptz (timestamp with time zone) data type.

We can tell the Rails DSL to generate this type of column by abondoning the t.timestamps method and instead creating custom columns with t.column.

create_table :posts do |t|
  t.string :title, null: false
  # ...

  t.column :created_at, :timestamptz, null: false
  t.column :updated_at, :timestamptz, null: false
end

It is a little less convenient than the t.timestamps helper, but it is nice to know we can have a little more control over the data type.

Last updated