代码之家  ›  专栏  ›  技术社区  ›  Alvaro Alday

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

  •  0
  • Alvaro Alday  · 技术社区  · 7 年前

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

    1. 对于每个公司,验证一组名称是否是与其关联的话语类的实例。
    2. 如果没有,请继续迁移

    当前行为

    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 回复  |  直到 7 年前
        1
  •  3
  •   Ilya Konyukhov    7 年前

    一般来说,不建议在Rails迁移中编写自定义代码。迁移是为了对数据库模式进行操作。你操纵数据。

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

    raise StandardError, "Invalid data"
    

    在这种情况下,将停止迁移并 schema_migrations 表)。下一个电话 rake db:migrate 它将再次尝试运行该迁移。