我正在对我当前的项目进行相当艰巨的重构。在到达这个十字路口之前,我有两个模型,我意识到它们实际上是同一个模型,但处于不同的状态,我想用这种方式来表示系统。因此,我必须将即将失效的模型的所有对象移到另一个模型中,并正确设置新的状态列。这个问题很简单,特别是因为模型非常相似
对我来说,痛点是我必须在双向迁移的某个中点做出这些改变。从这里到那里的路径有点像:
add_column :model_ones, :status, :string
make_all_model_two_records_into_model_one_records()
drop_table :model_twos
显然,另一个方向也很容易定义
create_table :model_twos do |t|
...
end
move_model_ones_with_status_x_into_model_twos_table
remove_column :model_ones, :status
这是一个好消息,但当我从回购中删除ModelTwo.rb的神奇时刻到来时,整个事情就完蛋了。在这一点上,我永远无法从底层迁移到没有阅读该源代码的地方。对此,我的反应是要么直接编写sql来来回移动数据,要么从迁移中去掉数据转换。如果我把它拿出来,它到底会去哪里?如何确保迁移时在正确的时间进行?
比方说,我克服了问题的这一方面,现在我可以快乐地从零迁移到现在。我永远不能向下迁移,对吧?这是否代表了分阶段迁移的概念对我来说已经过时的某个时刻?
我想我可以回去按摩早期的迁徙,让世界相信ModelTwo根本不存在,但一想到要侵犯现有迁徙的神圣性,我就感到毛骨悚然。
人们必须在某个地方用Rails进行这种重构。它必须是可行的,对吧?我不知道怎么做。
提前感谢,jd
我会:
-
创建一个迁移,添加状态列
-
运行rake任务在中移动数据
-
测试所有正确移动的数据
-
运行另一个迁移以删除不需要的旧表。
有时,您需要更改旧的迁移,以确保可以轻松构建开发环境。我不知道你为什么认为这是个问题。迁移是为了帮助你,而不是你必须遵守的一些神奇规则。
有时,你可能对最佳实践过于执着,忘记了很难制定适用于每种情况的"最佳实践规则"。它们是很好的指南,但最终的最佳实践是做对您的项目最有利的事情。