【问题标题】:How to stop a migration if a validation is false?如果验证为假,如何停止迁移?
【发布时间】:2023-03-07 13:18:01
【问题描述】:

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

  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

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

预期行为

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

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 新手,我真的不知道该怎么做

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


【解决方案1】:

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

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

raise StandardError, "Invalid data"

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

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2012-08-09
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多