在Rails中向表中追溯添加时间戳,填充现有行

时间:2016-12-29 20:29:48

标签: sql ruby-on-rails activerecord

我想在Rails中为现有表添加时间戳,为当前时间的现有行填充created_atupdated_at。我知道我可以使用ActiveRecord做到这一点,但我真的很想在一个UPDATE命令中做到这一点,而对于我的生活,我似乎无法找到一个好方法。这样做。任何人都有他们想出的解决方案吗?

3 个答案:

答案 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}'")