2012-09-08 50 views
0

我正在对当前项目进行相当陡峭的重构。在到达这个十字路口之前,我有两个模型,我认识到它们是真正的模型,但是处于不同的状态,我想用这种方式表示系统。因此,我必须将即将停止使用的模型的所有对象移动到其他模型中,并正确设置新的状态列。问题很简单,尤其是因为模型非常相似。活动记录迁移和重构

对我来说,痛苦之处在于我必须在两个方向的迁移过程中在某个中点进行这些更改。从这里到那里的路径将是有点像:

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

+0

我没有看到问题。为什么你不能在“model_twos”放弃之后“从头开始移植”?它被创建并再次丢失......这有什么问题? – Mischa

回答

1

我想:

  1. 创建迁移,增加了状态栏

  2. 运行rake任务跨越

  3. 移动数据

    测试所有正确移动的数据

  4. 运行另一次迁移以删除不需要的旧表。

有时您需要更改旧的迁移以确保您可以轻松构建开发环境。我不确定你为什么认为这是一个问题。迁移在那里帮助你,而不是你应该遵守的一些魔法规则。

有些时候,你可能太过于挂断最佳实践,忘记了适用于每种情况的“最佳实践规则”是非常困难的。他们作为指导是很好的,但最终的最佳实践是为您的项目做最好的事情。