Rails风格指南says
不要在迁移中使用模型类。模型类不断发展,在未来的某些时候,由于使用的模型发生了变化,过去的迁移可能会停止。
如何在迁移过程中更改数据(一些批评的做法,但正在我正在开发的项目中使用),同时牢记这一建议?
答案 0 :(得分:1)
您可以在不遵循实际建议的情况下解决问题。我在迁移中使用模型类,但是我使用了一些策略来防止模型中的更改破坏我的迁移:
我定期将完全迁移的模式副本转储到db / schema.rb并删除我的迁移。当然,只有在需要运行的每个环境上运行所有迁移之后,才能执行此操作。将创建已迁移的新数据库,速度更快,并消除迁移与当前模型代码之间的不兼容。
当我需要在同一次迁移运行中立即使用早期迁移中更改的模式时,我会使用Model.reset_column_information
重新加载模型定义。
或者你可以接受这个建议,只需使用execute
在迁移中执行SQL。如果我可以避免它,我不这样做,因为使用模型方法通常会减少工作量。
答案 1 :(得分:0)
解决此问题的另一种方法是使用独立的模型,如rubocop中建议的那样:
class MigrationProduct < ActiveRecord::Base
self.table_name = :products
end
def up
MigrationProduct.where(status: old_status).update_all(status: new_status)
end