Фон
У нас есть скрипт миграции рельсов, как показано ниже:
...
...
0011_update_column1_for_internal_projects.rb
...
...
0022_create_audits.rb
Мы создали обратные вызовы after_create / update / delete для модели InternalProject, которая обновляет таблицу Audits для отслеживания события, которое произошло в модели.
Фрагмент кода
Скрипт переноса БД - 0011 - имеет self.up метод, определенный ниже:
def self.up
InternalProject.all.each do |project|
project.column1 = project.column2
project.save!
end
end
Побочный эффект
С помощью скрипта 0022 мы попали в ситуацию, когда скрипт 0011 не переносится, потому что у нас есть тестовые приборы для загрузки некоторых начальных данных для внутренних проектов.Теперь этот сбой, потому что при сохранении InternalProject срабатывает обратный вызов, и в этот момент состояние БД, поскольку 0022 не запускается, таблица Audit не существует, и поэтому мы получаем ошибку SQL с жалобой на то, что таблица не существует.
Мой вопрос
1. Как исправить скрипт переноса БД 0011, чтобы предотвратить вызовы обратных вызовов при сохранении InternalProject?Я хотел бы знать аккуратный способ сделать это.
2. У меня возникает вопрос, удаляется ли такой скрипт обновления.Это плохая идея?Должны ли мы иметь скрипты для манипулирования данными при переносе БД?
3. Если в скриптах переноса БД есть скрипты манипулирования данными , можем ли мы что-то с этим сделать?