何时可以在self中引发ActiveRecord::不可逆转迁移异常.向下迁移的方法?您应该在什么时候采取措施来真正实现迁移的逆转?

推荐答案

If you are dealing with production-grade systems那么是的,非常糟糕.如果这是你自己的宠物项目,那么任何事情都是允许的(如果没有其他事情,这将是一种学习经验:)尽管很可能是早晚,即使是在宠物项目中,你也会发现自己已经跨越了反向迁移,只需在几天后撤销该迁移,无论是通过rake还是手动)

在生产场景中,您应该在生产过程中遇到always make the effort to write and test a reversible migration个错误,然后发现一个错误,该错误迫使您回滚(代码and模式)到以前的某个版本(等待一些非琐碎的修复——以及其他不可用的生产系统)

反向迁移的范围从最简单的(删除迁移过程中添加的列或表,和/或更改列类型等)到更复杂的(JOINed INSERTUPDATEs中的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,然后再次运行我,我不会让您失败!")

Ruby-on-rails相关问答推荐

对Rails进行枚举不允许空值

Rails 7.1,登录到STDOUT和LOG/Production.log

Rails 创建自定义函数/方法以及存储位置

Selenium chromedriver:无法从不可键入的键构造KeyEvent

Rails:序列化数据库中的对象?

如何将实例变量传递给 RSpec 共享示例

从 Rails 生成 PDF

在 Nokogiri 中获取属性值以提取链接 URL

如何将 yaml 文件解析为 ruby​​ 哈希和/或数组?

Rails - 从日期和时间戳获取日期

Rails:仅在创建时验证,或者当字段不为空时在更新时验证

通过 Ruby 或 Rails 的 LDAP

您将 Rack 中间件文件和要求放在哪里?

在范围内传递参数

如何从另一个调用 Capistrano 任务?

如何翻译 ActiveRecord 模型类名称?

使用 heroku 和 namecheap 设置自定义域

Rails 路由:GET 没有参数 :id

如何在 Rails 3 中订购包含的元素

Rails - 邮件,将正文作为纯文本获取