mirror of
https://github.com/jbranchaud/til
synced 2026-01-03 15:18:01 +00:00
42 lines
1.4 KiB
Markdown
42 lines
1.4 KiB
Markdown
# Add timestamptz Columns With The Migration DSL
|
|
|
|
The Rails migration DSL comes with the
|
|
[`t.timestamps`](https://edgeapi.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#method-i-timestamps)
|
|
method. This allows you to add the `created_at` and `updated_at` timestamp
|
|
columns that are standard for most models in Rails apps.
|
|
|
|
```ruby
|
|
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`)](https://www.postgresql.org/docs/current/datatype-datetime.html) 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`](https://edgeapi.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#method-i-column).
|
|
|
|
```ruby
|
|
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.
|