Переименовать имя класса модели рельсов наследования одной таблицы без изменения существующих данных

#ruby-on-rails #rails-activerecord #single-table-inheritance

#ruby-on-rails #rails-activerecord #single-table-inheritance

Вопрос:

У меня есть подкласс ActiveRecord STI, который я хочу переименовать (изменение с учетом регистра).

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

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

Пример:

Класс Uld < Component должен стать ULD < Component . Подход к переименованию потребует миграции БД

 def up
  Component.where(type: 'Uld').update_all(type: 'ULD')
end

def down
  Component.where(type: 'ULD').update_all(type: 'Uld')
end
 

Но при развертывании на heroku это может вызвать проблемы, поскольку изменение данных происходит первым, а в коде даже нет нового доступного имени класса. Поэтому этот раздел кодовой базы не будет использоваться в течение нескольких минут. Нехорошо для изменения, о котором пользователи даже не заботятся :/

Ответ №1:

Вот как вы могли бы это сделать:

  1. Создайте ULD < Component компонент / файл, который является копией Uld < Component . Т.е. Имейте 2 компонента, не удаляйте Uld
  2. В местах, где вы ранее извлекали Uld , сделайте так, чтобы теперь вы извлекали записи, где тип Uld или ULD
  3. В местах, где вы создали новые Uld записи, сделайте так, чтобы вместо этого создавались новые ULD записи
  4. Внедрите эти изменения без каких-либо миграций, таким образом, ваши серверы будут обратно совместимы с Uld , но также будут работать с ULD
  5. Разверните миграцию прямо сейчас
  6. Наконец, удалите все упоминания / файлы, связанные со старым Uld , и снова разверните