我有一个迁移要运行,但在运行之前我想验证某些条件(即迁移在模型上调用实例方法,并且我想在运行迁移之前确保该方法存在)。
考虑到这一点,如果验证没有通过,我找不到任何解释如何停止迁移的文档。似乎最有可能提出异常是这样做的明智之举。我发现ActiveRecord::Rollback
看起来是一个很好的候选者,因为它明确地回滚了一个事务,但它也具有在事务回滚后不再重新提升的特性,所以我可能不会看到任何消息我附加到例外。
我一直在搜索“rails取消迁移”之类的内容,但所有结果似乎都是针对无意中取消的迁移。我想在某些条件下故意(和优雅地)失败。
答案 0 :(得分:1)
我最终做的事实上是raise Exception
,因为ActiveRecord::Rollback
会将迁移计为已完成,并且在修复错误后不允许重新运行。
答案 1 :(得分:0)
如果在迁移中引发异常,则会停止迁移。
根据您的需要,您还可以尝试创建交互式迁移:
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
个密码,只根据状态运行命令。迁移仍将完成,但操作将无法运行。