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_many
和 belongs_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
您需要重现您希望迁移使用的任何关联或验证。您最终会进行更大的迁移,但您确切知道迁移使用的是什么模型代码,而不是迁移 运行.
时当前使用的任何代码
在一个 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_many
和 belongs_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
您需要重现您希望迁移使用的任何关联或验证。您最终会进行更大的迁移,但您确切知道迁移使用的是什么模型代码,而不是迁移 运行.
时当前使用的任何代码