我正在对我当前的项目进行相当陡峭的重构。在到达这个十字路口之前,我有两个模型,我意识到它们实际上是相同的模型,但处于不同的状态,我想以这种方式表示系统。结果,我必须将即将失效的模型的所有对象移到另一个模型中并正确设置新的状态列。这个问题在代码方面很简单,特别是因为模型非常相似。
对我来说,痛点是我必须在双向迁移的某个中间点进行这些更改。从这里到那里的路径将类似于:
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