要求 我需要为执行以下操作的实时生产数据库创建迁移:
当前行为 我尝试过:
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
答案 0 :(得分:2)
通常来说,不建议在Rails迁移中编写自定义代码。迁移是针对数据库架构的操作。您可以处理数据。
回答您的问题:您可以通过引发异常来停止迁移,例如:
raise StandardError, "Invalid data"
在这种情况下,迁移将停止,并且未标记为已完成(迁移版本不会保存到数据库的schema_migrations
表中)。在下一次调用rake db:migrate
时,它将尝试再次运行该迁移。