【问题标题】:Best way to populate a new attribute (new database column) of existing Rails models?填充现有 Rails 模型的新属性(新数据库列)的最佳方法?
【发布时间】:2014-07-22 09:17:21
【问题描述】:

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

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 属性?什么是最简单/最佳实践方式?可以在应用程序代码本身、控制台、终端或其他地方。谢谢!

【问题讨论】:

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


    【解决方案1】:

    你会在这个问题上得到很多固执己见的答案。有些人会建议使用控制台,有些人会建议一次性 rake 任务。

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

    或者,如果将可移动日期设置为 created_at 日期那么简单,您可以使用 Document.update_all("moveable_date = created_at") 之类的东西,而不是遍历它们。

    【讨论】:

    • 感谢您的回复!我认为Document.reset_column_information 是我需要的,除了将它放入迁移文件似乎什么都不做,就像在控制台中输入它一样。该属性仍然是nil。你能澄清一下这个方法的具体用法吗?
    • 它所做的只是让 Rails 知道你的新专栏。如果您不这样做,那么在您的迁移中,当您实例化 Document 对象时,它们将没有 moveable_date 字段。
    • 哦,所以它没有用默认值填充它(例如通过调用before_create 钩子)?而且如果我想这样做,我必须在迁移中这样做,除了reset_column_information,这是正确的解释吗?
    【解决方案2】:

    这是个好建议!

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

    【讨论】:

    • 这在我的特定应用程序中不起作用 - 我必须立即设置它,否则我的应用程序的其他部分会损坏。不过感谢您的建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    相关资源
    最近更新 更多