我需要一个额外的字段来为我的Profile
模型进行自定义排序。所以我需要在列添加时初始化它。
现在我看到两种方法:
写下类似的东西
Profile.all.each { |p| p.update_attribute :sorted_at, p.created_at }
在单独的迁移文件中。
第二种解决方案是好还是坏?可能有第三种解决方案比这些更好吗?
答案 0 :(得分:2)
我的意见是更新迁移中的字段。
优点:
缺点:
此外,最好使用update_all
而不是循环遍历每条记录并进行更新,因为性能明显提升。
答案 1 :(得分:0)
有一个db:seed rake任务,专门用于更新数据。通过的是,迁移应仅用于模式更改。
但是,在尝试将数据更改保留在我的迁移之后,我再次得出结论,迁移对他们来说是个好地方。毕竟,您想要的是更新只运行一次,并且迁移会跟踪哪些迁移已运行以及哪些需要运行,因此它们只运行一次。
我的经验法则是:
1。如果它是初始数据,则将它放在seeds.rb脚本中,该数据必须位于数据库中才能运行应用程序。也就是说,它是初始状态的一部分,交付给客户。没有用户界面。如果稍后删除数据,则永远不会有有效状态。一个例子是工作流程步骤。
我有seeds.rb为每个表调用其他脚本,比如seed_workflow_steps.rb。此外,即使数据在表中,也应编写种子脚本以便运行。它们不应该用于存在用户可能故意删除记录的用户界面的数据,因为如果种子任务再次运行,它将把它放回并撤消用户的更改。
2。您可以将其置于迁移中,但前提是它是用于创建存储它的表或字段的迁移。换句话说,您正在将新表或列初始化为初始状态,因为它是初始传递,因此在第一次显示该功能时它不是空白。这样做的好处是,向下迁移将丢弃表或字段,并负责撤消数据的填充。
3。否则,将其放在rake任务或脚本中,并将任务或脚本作为部署步骤运行。一个良好的完整开发过程应该让开发人员能够记录部署的额外步骤。