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

时间:2018-10-15 21:01:56

标签: ruby-on-rails validation migration rails-migrations

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

  1. 对于每个公司,请验证一组名称是否是与其关联的话语类的实例。
  2. 如果上述验证不存在,则验证失败并返回错误。
  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

尽管对数据库进行了更改,但是没有发生,我需要迁移以错误停止。目前,当我不存在任何话语时,迁移不会因任何形式的错误而停止。

预期的行为

我想知道如何在不存在任何实例的情况下简单地返回错误并停止迁移。 像这样:

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

1 个答案:

答案 0 :(得分:2)

通常来说,不建议在Rails迁移中编写自定义代码。迁移是针对数据库架构的操作。您可以处理数据。

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

raise StandardError, "Invalid data"

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