Add timestamps to an existing table Add timestamps to an existing table ruby ruby

Add timestamps to an existing table


The timestamp helper is only available in the create_table block. You can add these columns by specifying the column types manually:

class AddTimestampsToUser < ActiveRecord::Migration  def change_table    add_column :users, :created_at, :datetime, null: false    add_column :users, :updated_at, :datetime, null: false  endend

While this does not have the same terse syntax as the add_timestamps method you have specified above, Rails will still treat these columns as timestamp columns, and update the values normally.


Migrations are just two class methods (or instance methods in 3.1): up and down (and sometimes a change instance method in 3.1). You want your changes to go into the up method:

class AddTimestampsToUser < ActiveRecord::Migration  def self.up # Or `def up` in 3.1    change_table :users do |t|      t.timestamps    end  end  def self.down # Or `def down` in 3.1    remove_column :users, :created_at    remove_column :users, :updated_at  endend

If you're in 3.1 then you could also use change (thanks Dave):

class AddTimestampsToUser < ActiveRecord::Migration  def change    change_table(:users) { |t| t.timestamps }  endend

Perhaps you're confusing def change, def change_table, and change_table.

See the migration guide for further details.


@user1899434's response picked up on the fact that an "existing" table here could mean a table with records already in it, records that you might not want to drop. So when you add timestamps with null: false, which is the default and often desirable, those existing records are all invalid.

But I think that answer can be improved upon, by combining the two steps into one migration, as well as using the more semantic add_timestamps method:

def change  add_timestamps :projects, default: Time.zone.now  change_column_default :projects, :created_at, nil  change_column_default :projects, :updated_at, nilend

You could substitute some other timestamp for DateTime.now, like if you wanted preexisting records to be created/updated at the dawn of time instead.