2010-12-03 61 views
5

我最近一直在写一些迁移,属于不可逆迁移伞。但他们不是世界末日不可逆转的。如果你愿意,你可以将它们推回去。我目前的情况正在改变一个多对多的关系。它涉及删除一个列并创建一个新的连接表。 (以及模型中的两条线)。不可逆转移 - 警告并确认而不是中止?

我在想,不是中止下移,而是说“这个迁移是[INSERT SCARY MESSAGE HERE],你确定要继续?Y/N”,然后回滚迁移他们选择?只需将迁移放入if语句中即可?

很容易使迁移不可逆转,通常有很好的理由(例如数据无法恢复)。这些问题通常是通过编写一个手动完成的迁移来解决的?

在我的不高兴的心情,它会很高兴有一个幸福的媒介。这是明智的吗?也许我只是不明白什么时候让它们不可逆转。

回答

1

如果可能的话,我总是尝试使迁移可逆。我认为遇到问题的唯一时候是从粗略定义的数据模型转到更细粒度的数据模型,然后再回来。尽管如此,我认为没有理由不使用您的解决方案,当然也取决于迁移的后果。也没有什么能够阻止运行向下迁移的人从注释掉你提出的错误并编写他们自己的代码来反向迁移,但它对你来说更安全,编写数据模型的人改变以知道如何转换回以前的状态,而不是他们猜测。

+0

“这是更安全对于你来说,编写数据模型的人会改变,知道如何转换回以前的状态,而不是猜测“。究竟!这就是为什么我有点惊讶,这个选项已经不可用 - 因为完全有可能有人会重写你写的异常。 – Nick 2010-12-03 02:19:45

+0

Ruby有很少的规则。考虑:http://gfredericks.com/gfrlog/post/51 所以,我们依靠常识,惯例和良好的测试:) – 2010-12-03 02:50:03

1

刚刚在这里发现了这个旧帖子 - 就像我在某个问题上挣扎着一样。

我有另一种情况:从多对多(HABTM)移动到一对多。当然,我想在之后删除连接表。我真的很害怕在部署期间忘记复制连接表中的数据。所以我决定将“警告”迁移:

class DataMigrationWarning < ActiveRecord::Migration 
    def change 

    puts("********************** Data Migration Warning **********************") 
    puts("Dont forgett to save the data.") 
    puts("Next UP migration will delete table XYZ.") 
    puts("Next DOWN migration will delete field A in table BCD.") 
    puts("press y for continue.") 
    puts("press anything else for stopping.") 

    if STDIN.gets.chomp == "y" 
     puts("Ok then!") 
    else 
     fail 
    end 

    # More detailed explanation... 

    end 
end 

命令行将然后就显示所有在那里的东西,并等待来自用户的输入。你只需要进行下一次迁移。所有其他投入将停止迁移和所有后续。

过程看着像底:

  1. 迁移:belong_to
  2. 警告迁移
  3. 迁移创建新的新领域:删除旧的连接表