190

タイムスタンプ ( created_at& updated_at) を既存のテーブルに追加する必要があります。次のコードを試しましたが、うまくいきませんでした。

class AddTimestampsToUser < ActiveRecord::Migration
    def change_table
        add_timestamps(:users)
    end
end
4

21 に答える 21

232

タイムスタンプ ヘルパーは、create_tableブロックでのみ使用できます。これらの列は、列の種類を手動で指定して追加できます。

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

これは上で指定したメソッドと同じ簡潔な構文ではありませんがadd_timestamps、Rails はこれらの列をタイムスタンプ列として扱い、値を通常通り更新します。

于 2011-09-25T01:13:54.313 に答える
96

移行は、2 つのクラス メソッド (または 3.1 のインスタンス メソッド):updown(change場合によっては 3.1 のインスタンス メソッド) です。up変更をメソッドに入れる必要があります。

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

3.1 を使用している場合は、以下も使用できますchange(Dave に感謝):

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

def changedef change_table、 と を混同している可能性がありchange_tableます。

詳細については、移行ガイドを参照してください。

于 2011-09-25T01:14:45.913 に答える
81

元のコードは右に非常に近く、別のメソッド名を使用する必要があります。Rails 3.1 以降を使用している場合は、change代わりにメソッドを定義する必要がありchange_tableます。

class AddTimestampsToUser < ActiveRecord::Migration
  def change
    add_timestamps(:users)
  end
end

古いバージョンを使用している場合は、 の代わりにupおよびdownメソッドを定義する必要がありchange_tableます。

class AddTimestampsToUser < ActiveRecord::Migration
  def up
    add_timestamps(:users)
  end

  def down
    remove_timestamps(:users)
  end
end
于 2012-09-30T12:00:18.970 に答える
40
class AddTimestampsToUser < ActiveRecord::Migration
  def change
    change_table :users do |t|
      t.timestamps
    end
  end
end

利用可能な変換は

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

于 2011-09-25T02:23:49.880 に答える
3

ここには多くの回答がありますが、以前の回答はどれも実際にはうまくいかなかったので、私も投稿します:)

一部の人が指摘しているように、#add_timestamps残念ながらnull: false制限が追加されています。これにより、これらの値が入力されていないため、古い行が無効になります。ここでのほとんどの回答は、デフォルト値 ( ) を設定することを示唆していますTime.zone.nowが、古いデータのデフォルトのタイムスタンプは正しくないため、そうしたくありません。テーブルに間違ったデータを追加することに価値がありません。

したがって、私の移行は単純でした:

class AddTimestampsToUser < ActiveRecord::Migration
  def change_table
    add_column :projects, :created_at, :datetime
    add_column :projects, :updated_at, :datetime
  end
end

いいえnull: false、その他の制限はありません。created_at古い行は、 as NULL、およびupdate_atasで引き続き有効ですNULL(行に対して何らかの更新が実行されるまで)。新しい行にはcreated_atupdated_at期待どおりにデータが取り込まれます。

于 2019-07-15T16:43:25.250 に答える
2

(既存のデータベースがあると仮定して)各テーブルにcreated_atフィールドとupdated_atフィールドを追加するために呼び出すことができる単純な関数を作成しました。

  # 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
于 2012-08-20T21:25:24.567 に答える
2

これは、既存のテーブルにタイムスタンプを追加する簡単なものです。

class AddTimeStampToCustomFieldMeatadata < ActiveRecord::Migration
  def change
    add_timestamps :custom_field_metadata
  end
end
于 2020-06-09T05:21:40.543 に答える