我想在Rails中为现有表添加时间戳,为当前时间的现有行填充created_at
和updated_at
。我知道我可以使用ActiveRecord做到这一点,但我真的很想在一个UPDATE
命令中做到这一点,而对于我的生活,我似乎无法找到一个好方法。这样做。任何人都有他们想出的解决方案吗?
答案 0 :(得分:3)
这是我最终完成的完整解决方案:
class SomeMigration < ActiveRecord::Migration[5.0]
def up
add_and_backfill_timestamps_for(Foo)
end
def down
remove_timestamps_for(Foo)
end
private
def add_and_backfill_timestamps_for(model)
add_timestamps model.table_name, null: true
model.update_all(created_at: now, updated_at: now)
change_column_null model.table_name, :created_at, false
change_column_null model.table_name, :updated_at, false
end
def remove_timestamps_for(model)
remove_column model.table_name, :created_at
remove_column model.table_name, :updated_at
end
def now
@_now ||= Time.zone.now
end
end
答案 1 :(得分:2)
怎么样
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": ["es2015", "dom"],
"noImplicitAny": true,
"suppressImplicitAnyIndexErrors": true
}
}
答案 2 :(得分:0)
这条线给我的一些模型造成了问题:
<块引用>model.update_all(created_at: Time.now, updated_at: Time.now)
所以我把它改成了一个不太优雅的方法:
ActiveRecord::Base.connection.execute("update #{model.table_name} set created_at = '#{Time.now}', updated_at = '#{Time.now}'")