2017-01-26 20 views
1

Большое изменение, я говорю об абстрактных «действиях» сейчас, а не о тех, которые у меня были раньше; это был лишь пример.«Откат» миграции нескольких 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 знает для каждого шага, является ли он обратимым. Поэтому, предполагая, что все предыдущие шаги до отказа были обратимыми, он знает, что можно отменить.

Есть ли опция, флаг, механизм для этого? Я не хочу сам программировать логику, не проверяя заранее, нужно ли это действие или не вылавливать исключения.

+0

Используете ли вы MySQL? – denys281

ответ

1

Проверьте, если таблица существует до создания таблицы:

# In Rails 2, 3 & 4: 
unless ActiveRecord::Base.connection.table_exists?('a') 
    create_table :a do ... 
end 
unless ActiveRecord::Base.connection.table_exists?('b') 
    create_table :b do ... 
end 
# ... 



# In rails 5: 
unless ActiveRecord::Base.connection.data_source_exists?('a') 
    create_table :a do ... 
end 
unless ActiveRecord::Base.connection.data_source_exists?('b') 
    create_table :b do ... 
end 
# ... 
+0

См. Разъяснение, которое я добавил к вопросу. – AnoE

 Смежные вопросы

  • Нет связанных вопросов^_^