Rails 4:删除 类(关联)与迁移

Rails 4: removing classes (associations) with migrations

在一个 rails 应用程序中,我正在进行相对主要的重构(在功能分支中),它删除(并替换)了几个 has many :through 类型关联。由于结构变化比较大,我通过循环遍历 'through' class 中的所有对象并用新对象替换它,然后保存。这比 raw SQL 更安全(也更容易),虽然当然更慢,但这是我愿意付出的代价。迁移大致如下所示:

def up
  create_table :new_through_table ...
  OldThroughTable.find_each do |x|
    # ... data conversion
    NewThroughTable.create(...)
  end
  drop_table :old_through_table
end

def down
  # vice versa
end

在此更改过程中,我在 app/models 中创建了新的 classes 并且一旦迁移完成,旧的关联 classes 现在是多余的,所以我删除了class 文件和相关 class 中的 has_manybelongs_to 代码行并提交结果。

但是,由于旧的关联 classes 现在已经消失,任何提取我的更改的人之后都无法 运行 迁移,因为旧的 class 文件已经消失并且旧的数据库结构不再映射到新的 class 结构。

我可以 - 理论上 - 将迁移编写为不需要任何 class(原始 SQL),但这对我来说似乎很麻烦 - 另外,我缺少任何验证和回调 class有。我也可以将旧的 class 文件和关联留在那里,但我不太喜欢这个主意。

是否有任何其他干净的方法来编写这样的迁移,以便它在保持代码干净的同时在两个方向上可靠地执行?

一种方法是将迁移需要的模型放入迁移中,即

class SomeMigration < ActiveRecord::Migration
  class SomeModel < ActiveRecord::Base
    ...
  end

  def up
    SomeModel.find_each do |record|
      ...
    end

    drop_table :some_models
  end
end

您需要重现您希望迁移使用的任何关联或验证。您最终会进行更大的迁移,但您确切知道迁移使用的是什么模型代码,而不是迁移 运行.

时当前使用的任何代码