Rails迁移中模型类的替代方法

时间:2016-03-03 23:54:39

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

Rails风格指南says

  

不要在迁移中使用模型类。模型类不断发展,在未来的某些时候,由于使用的模型发生了变化,过去的迁移可能会停止。

如何在迁移过程中更改数据(一些批评的做法,但正在我正在开发的项目中使用),同时牢记这一建议?

2 个答案:

答案 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

或者像another article