我需要将时间戳(created_at
& updated_at
)添加到现有表中。我尝试了下面的代码,但它不起作用。
class AddTimestampsToUser < ActiveRecord::Migration
def change_table
add_timestamps(:users)
end
end
发布于 2011-09-25 09:13:54
时间戳帮助器仅在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-25 09:14:46
迁移只是两个类方法(在3.1中是实例方法):up
和down
(在3.1中有时是change
实例方法)。您希望您的更改进入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
(谢谢戴夫):
class AddTimestampsToUser < ActiveRecord::Migration
def change
change_table(:users) { |t| t.timestamps }
end
end
也许您混淆了def change
、def change_table
和change_table
。
有关更多详细信息,请参阅migration guide。
发布于 2017-04-22 01:29:27
@user1899434的回应是,这里的“现有”表可能意味着其中已经有记录的表,这些记录可能是您不想删除的记录。因此,当您添加带有null: false的时间戳时,这些现有记录都是无效的。
但我认为,通过将两个步骤结合到一个迁移中,以及使用更具语义的add_timestamps方法,可以改进这个答案:
def change
add_timestamps :projects, default: Time.zone.now
change_column_default :projects, :created_at, nil
change_column_default :projects, :updated_at, nil
end
您可以用其他时间戳替换DateTime.now
,例如,如果您希望在黎明时创建/更新预先存在的记录。
https://stackoverflow.com/questions/7542976
复制相似问题