Как остановить миграцию, если проверка неверна? - PullRequest
0 голосов
/ 16 октября 2018

Требования Мне нужно создать миграцию для действующей производственной базы данных, которая выполняет следующие действия:

  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 голосов
/ 16 октября 2018

Вообще говоря, не рекомендуется писать собственный код в миграциях Rails.Миграции предназначены для манипуляций со схемой базы данных.Вы манипулируете данными.

Отвечая на ваш вопрос: вы можете просто остановить миграцию, вызвав исключение, например:

raise StandardError, "Invalid data"

В этом случае миграция будет остановлена ​​и не помечен как завершенный (версия миграции не будет сохранена в таблице schema_migrations в вашей базе данных).При следующем вызове rake db:migrate он попытается снова запустить эту миграцию.

...