活动记录迁移和重构

时间:2012-09-08 02:27:55

标签: ruby-on-rails refactoring rails-migrations

我正在对我目前的项目进行相当严格的重构。在到达这个十字路口之前,我有两个模型,我才意识到它们实际上是相同的模型,但处于不同的状态,我希望用这种方式表示系统。因此,我必须将即将失效的模型的所有对象移动到另一个模型中并正确设置新状态列。问题在于代码简单,特别是因为模型非常相似。

对我而言,痛点在于我必须在两个方向的迁移中的某个中点进行这些更改。从这里到那里的路径有点像:

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

1 个答案:

答案 0 :(得分:1)

我会:

  1. 创建添加状态列的迁移

  2. 运行rake任务以跨

  3. 移动数据
  4. 测试所有正确移动的数据

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

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

    有时候,你可能会对最佳实践过于沉溺,并且忘记了适用于所有情况的“最佳实践规则”非常困难。他们是一个很好的指导,但最终的最佳做法是做最适合你的项目。