何时可以在self中引发ActiveRecord::不可逆转迁移异常.向下迁移的方法?您应该在什么时候采取措施来真正实现迁移的逆转?
何时可以在self中引发ActiveRecord::不可逆转迁移异常.向下迁移的方法?您应该在什么时候采取措施来真正实现迁移的逆转?
If you are dealing with production-grade systems那么是的,非常糟糕.如果这是你自己的宠物项目,那么任何事情都是允许的(如果没有其他事情,这将是一种学习经验:)尽管很可能是早晚,即使是在宠物项目中,你也会发现自己已经跨越了反向迁移,只需在几天后撤销该迁移,无论是通过rake
还是手动)
在生产场景中,您应该在生产过程中遇到always make the effort to write and test a reversible migration个错误,然后发现一个错误,该错误迫使您回滚(代码and模式)到以前的某个版本(等待一些非琐碎的修复——以及其他不可用的生产系统)
反向迁移的范围从最简单的(删除迁移过程中添加的列或表,和/或更改列类型等)到更复杂的(JOIN
ed INSERT
或UPDATE
s中的execute
个),但没有什么比这更复杂的事情可以证明"将其隐藏起来".如果没有别的,强迫自己思考实现反向迁移的方法可以让您对正向迁移正在解决的问题有新的认识.
有时,您可能会遇到这样的情况:前向迁移会删除某个功能,从而导致数据从数据库中被丢弃.For obvious reasons, the reverse migration cannot resuscitate discarded data.尽管在这种情况下,可以建议让前向迁移自动保存数据,或者在可能发生的回滚情况下保留数据,作为彻底失败(保存到yml
、复制/移动到特殊表等)的替代方案,但您不必,因为测试这种自动化程序所需的时间可能会超过手动恢复数据所需的时间(如果需要的话)But even in such cases, instead of just failing,在等待某些用户操作时,您始终可以使反向迁移conditionally and temporarily失败(即,测试是否存在某些需要手动还原的表;如果缺少,则输出"我失败了,因为我无法从虚无中重新创建表XYZ
;从备份中手动还原表XYZ
,然后再次运行我,我不会让您失败!")