如果验证为假,如何停止迁移?

How to stop a migration if a validation is false?

要求 我需要为执行以下操作的实时生产数据库创建迁移:

  1. 对于每家公司,验证一组名称是否是与之关联的话语 class 的实例。
  2. 如果所述验证不存在,则验证失败并且 return 出错。
  3. 如果没有继续迁移

当前行为 我试过这个:

class AddFeature < ActiveRecord::Migration[5.1]
  def change
    run_migration = true
    Company.all.each do |organization|
      Company.product_types_names.each { |type| run_migration &= Utterance.exists?("utter_#{type.to_s}", organization.id) }
    end

    if run_migration
      # my code
    end
  end
end

虽然对数据库的更改没有发生,但我需要迁移停止并出现错误。目前,当 I 语句不存在时,迁移不会因任何形式的错误而停止。

预期行为

我想知道如何简单地 return 一个错误并在任何一个实例不存在时停止迁移。 像这样:

class AddFeature < ActiveRecord::Migration[5.1]
  def change
    Company.all.each do |organization|
      Company.product_types_names.each { |type| run_migration &= Utterance.exists?("utter_#{type.to_s}", organization.id) }
      # return_errors_and stop the app if validation false
    end

    # my code
  end
end

一般来说,不建议在 Rails 迁移中编写自定义代码。迁移用于对数据库模式的操作。你操纵数据。

回答您的问题:您可以通过引发异常来简单地停止迁移,例如:

raise StandardError, "Invalid data"

在这种情况下,迁移将停止并且 不会 标记为已完成(迁移版本不会保存到数据库中的 schema_migrations table ).在下次调用 rake db:migrate 时,它将再次尝试 运行 该迁移。