【发布时间】: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_many 和 belongs_to 中的代码行关联的类并提交结果。
但是,由于旧的关联类现在已经消失,任何拉动我的更改的人之后都无法运行迁移,因为旧的类文件已经消失,旧的数据库结构不再映射到新的类结构。
我可以 - 理论上 - 将迁移编写为不需要任何类(原始 SQL),但这对我来说似乎很麻烦 - 另外,我缺少类所具有的任何验证和回调。我也可以把旧的类文件和关联留在那里,但我不太喜欢这个主意。
有没有其他简洁的方法来编写这样的迁移,以便在保持代码简洁的同时在两个方向上可靠地执行?
【问题讨论】:
-
您确认该类是在 drop_table 上实例化的吗?我认为我从来没有遇到过这个问题,尽管它过去曾让我担心。直接在您的数据库上创建一个“测试”表(而不是通过您的应用程序,因此不会定义模型)。使用“drop_table :test”创建一个迁移,如果它有效,那么你应该很高兴。
-
不是drop_table命令,是迁移中的数据转换需要循环新旧模型。我正在添加一个示例。
标签: ruby-on-rails-4 migration model-associations