From a8ec1ad9387b3d312dd4020c6911c3ff4e93650f Mon Sep 17 00:00:00 2001 From: jbranchaud Date: Sun, 14 Mar 2021 11:51:25 -0500 Subject: [PATCH] Add Add timestamptz Columns With The Migration DSL as a rails til --- README.md | 3 +- ...estamptz-columns-with-the-migration-dsl.md | 41 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 rails/add-timestamptz-columns-with-the-migration-dsl.md diff --git a/README.md b/README.md index e8ff274..f26e688 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ pairing with smart people at Hashrocket. For a steady stream of TILs, [sign up for my newsletter](https://tinyletter.com/jbranchaud). -_1084 TILs and counting..._ +_1085 TILs and counting..._ --- @@ -630,6 +630,7 @@ _1084 TILs and counting..._ - [Add A Foreign Key Reference To A Table](rails/add-a-foreign-key-reference-to-a-table.md) - [Add A Reference Column With An Index](rails/add-a-reference-column-with-an-index.md) - [Add React With Webpacker To A New Rails App](rails/add-react-with-webpacker-to-a-new-rails-app.md) +- [Add timestamptz Columns With The Migration DSL](rails/add-timestamptz-columns-with-the-migration-dsl.md) - [Access Secrets In A Rails 5.2 App](rails/access-secrets-in-a-rails-5-2-app.md) - [ActiveRecord Query For This Or That](rails/active-record-query-for-this-or-that.md) - [Advance The Date](rails/advance-the-date.md) diff --git a/rails/add-timestamptz-columns-with-the-migration-dsl.md b/rails/add-timestamptz-columns-with-the-migration-dsl.md new file mode 100644 index 0000000..9bb124d --- /dev/null +++ b/rails/add-timestamptz-columns-with-the-migration-dsl.md @@ -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.