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