Необратимые миграции - предупреждение и подтверждение вместо прерывания? - PullRequest
5 голосов
/ 03 декабря 2010

В последнее время я пишу некоторые миграции, которые попадают под зонтик необратимой миграции. Но они не конец света необратимый. Вы можете откатить их обратно, если хотите. Сценарий, который у меня есть на данный момент, заключается в изменении отношения один ко многим к соотношению многие ко многим. Это включает в себя удаление столбца и создание новой таблицы соединений. (а также две строчки в моделях).

Я думал, что вместо прерывания миграции вниз, я мог бы сказать что-то вроде: «Эта миграция [УСТАНОВИТЬ СТРАХОВОЕ СООБЩЕНИЕ ЗДЕСЬ], вы уверены, что хотите продолжить? Да / Нет», а затем откатить миграцию, если они выбрать? Просто поместите миграцию в оператор if?

Достаточно просто сделать миграцию необратимой, и обычно есть веская причина (например, данные не могут быть восстановлены). Эти проблемы обычно решаются простым написанием миграции, которая делает это вручную?

По-моему, было бы неплохо иметь счастливую среду. Это мудро? Может быть, я просто не понимаю, когда сделать их необратимыми.

Ответы [ 2 ]

1 голос
/ 11 июня 2015

Просто наткнулся на этот старый пост здесь, когда я как-то боролся за тот же вопрос.

У меня был другой случай: переход от многих ко многим (HABTM) к одному ко многим. Конечно, я хотел потом удалить таблицу соединений. Я действительно боялся, что забуду скопировать данные из таблицы соединений во время развертывания. Поэтому я решил включить «предупреждение» миграции:

class DataMigrationWarning < ActiveRecord::Migration
  def change

    puts("********************** Data Migration Warning **********************")
    puts("Dont forgett to save the data.")
    puts("Next UP migration will delete table XYZ.")
    puts("Next DOWN migration will delete field A in table BCD.")
    puts("press y for continue.")
    puts("press anything else for stopping.")

    if STDIN.gets.chomp == "y"
        puts("Ok then!")
    else
        fail
    end

    # More detailed explanation...

  end
end

Командная строка тогда просто покажет все вещи там и ждет ввода от пользователя. вы просто перейдете к следующей миграции. все остальные входы остановят миграцию и все последующие.

В итоге процесс выглядел так:

  1. Миграция: создание нового поля для нового принадлежащего
  2. Предупреждение о миграции
  3. Миграция: удаление старой таблицы соединений
1 голос
/ 03 декабря 2010

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

...