Ruby on rails 我应该如何*故意*停止迁移?

Ruby on rails 我应该如何*故意*停止迁移?,ruby-on-rails,rails-activerecord,rails-migrations,Ruby On Rails,Rails Activerecord,Rails Migrations,我有一个迁移要运行,但在它运行之前,我想验证某些条件(即迁移调用模型上的实例方法,并且我想在运行迁移之前确保该方法存在) 考虑到这一点,我找不到任何说明如何在验证不通过时停止迁移的文档。似乎最有可能的做法是提出一个例外情况。我发现ActiveRecord::Rollback,它看起来是一个很好的候选者,因为它显式地回滚事务,但它也具有事务回滚后不重新引发的特性,因此我可能不会看到附加到异常的任何消息 我一直在搜索“rails取消迁移”之类的内容,但所有结果似乎都是针对无意中取消的迁移。我希望在某

我有一个迁移要运行,但在它运行之前,我想验证某些条件(即迁移调用模型上的实例方法,并且我想在运行迁移之前确保该方法存在)

考虑到这一点,我找不到任何说明如何在验证不通过时停止迁移的文档。似乎最有可能的做法是提出一个例外情况。我发现
ActiveRecord::Rollback
,它看起来是一个很好的候选者,因为它显式地回滚事务,但它也具有事务回滚后不重新引发的特性,因此我可能不会看到附加到异常的任何消息


我一直在搜索“rails取消迁移”之类的内容,但所有结果似乎都是针对无意中取消的迁移。我希望在某些情况下故意(优雅地)失败。

如果在迁移过程中引发异常,它将停止迁移

根据需要,您还可以尝试创建交互式迁移:

puts "*** What would you like to do? ***"
puts "(a)dd columns AND copy data"
puts "(c)olumns only (no data copying)"
puts "(d)ata only (no column adding)"
puts "(q)uit"
reply = $stdin.gets.chomp

或者只是在迁移中添加一个
if
confition,并且只运行基于状态的命令。迁移仍将完成,但操作将不会运行。

我最终所做的实际上是
引发异常
,因为
ActiveRecord::Rollback
会将迁移计算为已完成,并且不允许在修复错误后重新运行。

有趣的问题。FWIW我也想过手动引发一个异常。我们不能断言这是否是最好的方法,但它肯定会奏效。当然,副作用是迁移不会被认为是成功的,并且将在下次您
rake db:migrate
时再次尝试运行(我相信这是您的意图)。如果交互仅在条件失败时触发(“它坏了。您想做什么?”),则交互将起作用。也可能难以在生产环境中运行(即在远程主机上)。如果操作没有运行,我希望避免迁移完成,因为我希望在修复问题后返回并重新运行。(不过,如果我不想重新参选,这会很有效。)