1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-07 00:58:02 +00:00

Add Add timestamptz Columns With The Migration DSL as a rails til

This commit is contained in:
jbranchaud
2021-03-14 11:51:25 -05:00
parent b9aeb03ef9
commit a8ec1ad938
2 changed files with 43 additions and 1 deletions

View File

@@ -0,0 +1,41 @@
# 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.