【问题标题】:Rails 4: removing classes (associations) with migrationsRails 4:使用迁移删除类(关联)
【发布时间】:2016-01-09 18:42:13
【问题描述】:

在 Rails 应用程序中,我正在做一个相对较大的重构(在功能分支中),它删除(并替换)了几个 has many :through 类型关联。由于结构更改相对较大,因此我通过循环遍历“通过”类中的所有对象并将其替换为新对象来进行此操作,然后将其保存。这比原始 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 中创建了新类,并且一旦迁移完成,旧的关联类现在就多余了,因此我删除了类文件以及 has_manybelongs_to 中的代码行关联的类并提交结果。

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

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

有没有其他简洁的方法来编写这样的迁移,以便在保持代码简洁的同时在两个方向上可靠地执行?

【问题讨论】:

  • 您确认该类是在 drop_table 上实例化的吗?我认为我从来没有遇到过这个问题,尽管它过去曾让我担心。直接在您的数据库上创建一个“测试”表(而不是通过您的应用程序,因此不会定义模型)。使用“drop_table :test”创建一个迁移,如果它有效,那么你应该很高兴。
  • 不是drop_table命令,是迁移中的数据转换需要循环新旧模型。我正在添加一个示例。

标签: ruby-on-rails-4 migration model-associations


【解决方案1】:

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

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

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

    drop_table :some_models
  end
end

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

【讨论】:

猜你喜欢
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2015-10-07
  • 1970-01-01
  • 2019-01-29
  • 2011-02-19
相关资源
最近更新 更多