在迁移中更新字段是个好主意吗?

时间:2012-05-02 07:50:13

标签: ruby-on-rails migration

我需要一个额外的字段来为我的Profile模型进行自定义排序。所以我需要在列添加时初始化它。

现在我看到两种方法:

  1. 通过rake任务或生产控制台迁移后更新字段。
  2. 写下类似的东西

    Profile.all.each { |p| p.update_attribute :sorted_at, p.created_at }
    

    在单独的迁移文件中。

  3. 第二种解决方案是好还是坏?可能有第三种解决方案比这些更好吗?

2 个答案:

答案 0 :(得分:2)

我的意见是更新迁移中的字段。

优点:

  • 这就是迁移的目的(?)
  • 没有任何麻烦的任务。因为人们很容易忘记运行任务,并且在出现错误或异常的情况下,您只能看到一个地方而不是2个。

缺点:

  • 无我能想到的

此外,最好使用update_all而不是循环遍历每条记录并进行更新,因为性能明显提升。

答案 1 :(得分:0)

有一个db:seed rake任务,专门用于更新数据。通过的是,迁移应仅用于模式更改。

但是,在尝试将数据更改保留在我的迁移之后,我再次得出结论,迁移对他们来说是个好地方。毕竟,您想要的是更新只运行一次,并且迁移会跟踪哪些迁移已运行以及哪些需要运行,因此它们只运行一次。

我的经验法则是:

1。如果它是初始数据,则将它放在seeds.rb脚本中,该数据必须位于数据库中才能运行应用程序。也就是说,它是初始状态的一部分,交付给客户。没有用户界面。如果稍后删除数据,则永远不会有有效状态。一个例子是工作流程步骤。

我有seeds.rb为每个表调用其他脚本,比如seed_workflow_steps.rb。此外,即使数据在表中,也应编写种子脚本以便运行。它们不应该用于存在用户可能故意删除记录的用户界面的数据,因为如果种子任务再次运行,它将把它放回并撤消用户的更改。

2。您可以将其置于迁移中,但前提是它是用于创建存储它的表或字段的迁移。换句话说,您正在将新表或列初始化为初始状态,因为它是初始传递,因此在第一次显示该功能时它不是空白。这样做的好处是,向下迁移将丢弃表或字段,并负责撤消数据的填充。

3。否则,将其放在rake任务或脚本中,并将任务或脚本作为部署步骤运行。一个良好的完整开发过程应该让开发人员能够记录部署的额外步骤。