У меня есть миграция, которая прерывается в середине нескольких изменений схемы.Когда он прерывается, генерируется исключение, и rake db: migrate завершает работу, оставляя мою базу данных в полу-перенастроенном состоянии.
Как я могу настроить его так, чтобы миграция автоматически возвращала только те изменения, которые были выполнены до сих пор?Я хотел бы сделать это глобально, когда в режиме разработки.Конечно, у кого-то есть лучший способ, чем встраивать каждый последующий AR::Migration::ClassMethod
в begin; rescue =>e opposite_action; end
блок.
Возможно, общий пример в следующем порядке:
#2010010100000000_made_a_typo.rb
class MadeATypo < ActiveRecord::Migration
def self.up
rename_column :birds, :url, :photo_file_name
rename_column :birds, :genius, :species #typo on :genius => :genus
end
def self.down
rename_column :birds, :photo_file_name, :url
rename_column :birds, :species, :genius
end
end
Эта миграция завершится неудачновторая строка с «гением столбца не найдена», но не записывает номер миграции в таблицу schema_migrations.Я бы хотел, чтобы он вызывал
rename_column :birds, :photo_file_name, :url #this is a revert of the first line
до того, как исключение было передано из MadeATypo.up
.
Ответы на комментарии:
Я понимаю, что mysql может не поддерживать DDL-транзакции, я ищу более прикладное решение, которое (вероятно) использует AR :: Migration.Конечно, кто-то создал плагин, который фиксирует вызовы методов для основного AR: M: ClassMethods и может перематывать их в большинстве случаев, если во время миграции возникает исключение.