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

4

1 回答 1

1

我会:

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

  2. 运行 rake 任务以移动数据

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

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

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

有时,您可能过于拘泥于最佳实践,而忘记了很难有适用于所有情况的“最佳实践规则”。它们可以作为很好的指南,但最终最佳实践是为您的项目做最好的事情。

于 2012-09-08T04:14:37.130 回答