Большое изменение, я говорю об абстрактных «действиях» сейчас, а не о тех, которые у меня были раньше; это был лишь пример.«Откат» миграции нескольких DDL
Сценарий
У меня есть миграции:
class XyzMigration < ActiveRecord:Migration
def change
first_action :a do ...
some_action :b do ...
other_action :c do ...
end
end
Если все 3 действия (то, что они являются, создание таблиц, индексов, модифицирующие столбцы и т.д.) добиться успеха, то все в порядке.
Но: Если действие b
не удалось, то миграция успешно выполнит a
, а затем остановится.
Проблема
В этом и заключается проблема: в настоящее время a
было сделано, что бы ни было, но миграция не является полным. То есть, когда я повторяю миграцию (после ручной фиксации проблемы, которая приводит к ошибке b
), я получаю сбой, что a
уже выполнен, и мне нужно вручную отменить a
.
Что бы ожидать
Я хочу сказать Rails, что это безопасно, чтобы отменить все выполненные шаги, если последний этап миграции не удается. Технически Rails может это сделать, потому что существует механизм отмены (мы можем использовать rake db:rollback
, чтобы отменить полную миграцию и b) Rails знает для каждого шага, является ли он обратимым. Поэтому, предполагая, что все предыдущие шаги до отказа были обратимыми, он знает, что можно отменить.
Есть ли опция, флаг, механизм для этого? Я не хочу сам программировать логику, не проверяя заранее, нужно ли это действие или не вылавливать исключения.
Используете ли вы MySQL? – denys281