填充现有Rails模型的新属性(新数据库列)的最佳方法是什么?

时间:2014-07-22 01:09:44

标签: ruby-on-rails-4 rails-activerecord

我刚刚在我的数据库中的现有表中添加了一个新列:

class AddMoveableDateToDocument < ActiveRecord::Migration
  def change
    add_column :documents, :moveable_date, :datetime
  end
end

在我的Rails模型中,我希望在创建时将moveable_date属性设置为默认值,应用程序将能够稍后更改此日期。所以,像:

class Document < ActiveRecord::Base
  before_create :set_moveable_date
  def set_moveable_date
    self.moveable_date ||= self.created_at
  end
end

现在,已保存到数据库中的现有模型尚未设置此moveable_date(值为nil)。如何运行所有现有模型并使用其默认值填充moveable_date属性?什么是最简单/最佳实践方式?可以在应用程序代码本身,控制台,终端或其他方面。谢谢!

2 个答案:

答案 0 :(得分:1)

你会在这个问题上获得很多自以为是的答案。有些人会建议控制台,有些人会建议一次性佣金。

我建议将其作为添加列的迁移的一部分。添加列后,您可以运行Document.reset_column_information以便Rails应用程序选择新列,然后迭代现有文档记录并根据需要设置可移动日期。

或者,如果将可移动日期设置为created_at日期这么简单,您可以使用Document.update_all("moveable_date = created_at")之类的内容,而不是迭代它们。

答案 1 :(得分:0)

这是一个很好的建议!

另一种方法是将线before_save :set_moveable_date添加到模型中。它不会立即完成转换,但如果您的数据定期更新,它就会起作用。