Add timestamps to an existing table

前端 未结 21 1097
予麋鹿
予麋鹿 2020-12-12 14:34

I need to add timestamps (created_at & updated_at) to an existing table. I tried the following code but it didn\'t work.

class          


        
相关标签:
21条回答
  • 2020-12-12 15:12

    Using Time.current is a good style https://github.com/rubocop-hq/rails-style-guide#timenow

    def change
      change_table :users do |t|
        t.timestamps default: Time.current
        t.change_default :created_at, from: Time.current, to: nil
        t.change_default :updated_at, from: Time.current, to: nil
      end
    end
    

    or

    def change
      add_timestamps :users, default: Time.current
      change_column_default :users, :created_at, from: Time.current, to: nil
      change_column_default :users, :updated_at, from: Time.current, to: nil
    end
    
    0 讨论(0)
  • 2020-12-12 15:13

    The answers before seem right however I faced issues if my table already has entries.

    I would get 'ERROR: column created_at contains null values'.

    To fix, I used:

    def up
      add_column :projects, :created_at, :datetime, default: nil, null: false
      add_column :projects, :updated_at, :datetime, default: nil, null: false
    end
    

    I then used the gem migration_data to add the time for current projects on the migration such as:

    def data
      Project.update_all created_at: Time.now
    end
    

    Then all projects created after this migration will be correctly updated. Make sure the server is restarted too so that Rails ActiveRecord starts tracking the timestamps on the record.

    0 讨论(0)
  • 2020-12-12 15:16

    Nick Davies answer is the most complete in terms of adding timestamp columns to a table with existing data. Its only downside is that it will raise ActiveRecord::IrreversibleMigration on a db:rollback.

    It should be modified like so to work in both directions:

    def change
      add_timestamps :campaigns, default: DateTime.now
      change_column_default :campaigns, :created_at, from: DateTime.now, to: nil
      change_column_default :campaigns, :updated_at, from: DateTime.now, to: nil
    end
    
    0 讨论(0)
  • 2020-12-12 15:19

    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
      end
    end
    

    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.

    0 讨论(0)
  • 2020-12-12 15:20

    I made a simple function that you can call to add to each table (assuming you have a existing database) the created_at and updated_at fields:

      # add created_at and updated_at to each table found.
      def add_datetime
        tables = ActiveRecord::Base.connection.tables
        tables.each do |t|
          ActiveRecord::Base.connection.add_timestamps t  
        end    
      end
    
    0 讨论(0)
  • 2020-12-12 15:21
    class AddTimestampsToUser < ActiveRecord::Migration
      def change
        change_table :users do |t|
          t.timestamps
        end
      end
    end
    

    Available transformations are

    change_table :table do |t|
      t.column
      t.index
      t.timestamps
      t.change
      t.change_default
      t.rename
      t.references
      t.belongs_to
      t.string
      t.text
      t.integer
      t.float
      t.decimal
      t.datetime
      t.timestamp
      t.time
      t.date
      t.binary
      t.boolean
      t.remove
      t.remove_references
      t.remove_belongs_to
      t.remove_index
      t.remove_timestamps
    end
    

    http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html

    0 讨论(0)
提交回复
热议问题