如果验证为假,如何停止迁移?
How to stop a migration if a validation is false?
要求
我需要为执行以下操作的实时生产数据库创建迁移:
- 对于每家公司,验证一组名称是否是与之关联的话语 class 的实例。
- 如果所述验证不存在,则验证失败并且 return 出错。
- 如果没有继续迁移
当前行为
我试过这个:
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
时,它将再次尝试 运行 该迁移。
要求 我需要为执行以下操作的实时生产数据库创建迁移:
- 对于每家公司,验证一组名称是否是与之关联的话语 class 的实例。
- 如果所述验证不存在,则验证失败并且 return 出错。
- 如果没有继续迁移
当前行为 我试过这个:
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
时,它将再次尝试 运行 该迁移。