Я нахожусь в процессе довольно крутого рефакторинга моего текущего проекта. До достижения этого перекрестка у меня есть две модели, которые, как я понял, на самом деле являются одной и той же моделью, но в другом состоянии, и я хочу представить систему таким образом. В результате я должен взять все объекты модели, которая скоро прекратит свое существование, переместить их в другую модель и правильно установить новый столбец статуса. Проблема проста с точки зрения кода, тем более что модели и так очень похожи.
Проблема для меня в том, что я должен внести эти изменения в какой-то середине моей миграции в обоих направлениях. Путь отсюда туда будет примерно таким:
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. Это должно быть осуществимо, верно? Я не могу понять, как это сделать.
Заранее спасибо, джд
model_twos
? Он создается и снова удаляется... в чем проблема? - person Mischa   schedule 08.09.2012