我该如何*故意*停止迁移?

时间:2014-11-26 20:10:45

标签: ruby-on-rails rails-activerecord rails-migrations

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

考虑到这一点,如果验证没有通过,我找不到任何解释如何停止迁移的文档。似乎最有可能提出异常是这样做的明智之举。我发现ActiveRecord::Rollback看起来是一个很好的候选者,因为它明确地回滚了一个事务,但它也具有在事务回滚后不再重新提升的特性,所以我可能不会看到任何消息我附加到例外。

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

2 个答案:

答案 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个密码,只根据状态运行命令。迁移仍将完成,但操作将无法运行。