Миграция активных записей и рефакторинг

Я нахожусь в процессе довольно крутого рефакторинга моего текущего проекта. До достижения этого перекрестка у меня есть две модели, которые, как я понял, на самом деле являются одной и той же моделью, но в другом состоянии, и я хочу представить систему таким образом. В результате я должен взять все объекты модели, которая скоро прекратит свое существование, переместить их в другую модель и правильно установить новый столбец статуса. Проблема проста с точки зрения кода, тем более что модели и так очень похожи.

Проблема для меня в том, что я должен внести эти изменения в какой-то середине моей миграции в обоих направлениях. Путь отсюда туда будет примерно таким:

add_column :model_ones, :status, :string

make_all_model_two_records_into_model_one_records()

drop_table :model_twos

Ясно, что другое направление также легко определить.

create_table :model_twos do |t|
  ...
end

move_model_ones_with_status_x_into_model_twos_table

remove_column :model_ones, :status

Это хорошо, но когда я дохожу до того волшебного момента, когда удаляю ModelTwo.rb из своего репозитория, все идет наперекосяк. В этот момент я не могу мигрировать с нуля без чтения этого источника. Моя реакция на это состоит в том, чтобы либо написать прямой sql для перемещения данных туда и обратно, либо исключить это преобразование данных из миграции. Если я его уберу, куда, черт возьми, он денется? Как убедиться, что это происходит в нужное время при миграции?

И допустим, я преодолеваю этот аспект проблемы и теперь могу счастливо мигрировать от нуля к настоящему. Я НИКОГДА не могу мигрировать вниз, верно? Представляет ли это какой-то момент времени, когда концепция поэтапной миграции просто мертва для меня?

Я полагаю, что мог бы вернуться и помассировать более ранние миграции, чтобы убедить мир в том, что ModelTwo вообще никогда не существовало, но мысль о нарушении неприкосновенности существующих миграций вызывает у меня мурашки по коже.

Люди должны уже где-то проводить подобный рефакторинг с Rails. Это должно быть осуществимо, верно? Я не могу понять, как это сделать.

Заранее спасибо, джд


person jaydel    schedule 08.09.2012    source источник
comment
Я не вижу проблемы. Почему вы не можете перейти с нуля после удаления model_twos? Он создается и снова удаляется... в чем проблема?   -  person Mischa    schedule 08.09.2012


Ответы (1)


Я буду:

  1. Создайте миграцию, которая добавляет столбец состояния

  2. Запустите задачу rake, чтобы переместить ваши данные через

  3. Проверить правильность перемещения всех данных

  4. Запустите еще одну миграцию для удаления старой таблицы, которая не нужна.

Иногда вам нужно будет изменить старые миграции, чтобы вы могли легко создавать среды разработки. Я не уверен, почему вы думаете, что это такая проблема. Миграции существуют, чтобы помочь вам, а не какое-то волшебное правило, которое вы должны соблюдать.

Иногда вы можете слишком увлечься лучшими практиками и забыть, что очень трудно иметь «правила лучших практик», применимые к любой ситуации. Они хороши в качестве руководства, но в конечном счете лучшая практика заключается в том, чтобы делать то, что лучше всего подходит для вашего проекта.

person Joel Friedlaender    schedule 08.09.2012