#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:
Вот как вы могли бы это сделать:
- Создайте
ULD < Component
компонент / файл, который является копиейUld < Component
. Т.е. Имейте 2 компонента, не удаляйтеUld
- В местах, где вы ранее извлекали
Uld
, сделайте так, чтобы теперь вы извлекали записи, где типUld
илиULD
- В местах, где вы создали новые
Uld
записи, сделайте так, чтобы вместо этого создавались новыеULD
записи - Внедрите эти изменения без каких-либо миграций, таким образом, ваши серверы будут обратно совместимы с
Uld
, но также будут работать сULD
- Разверните миграцию прямо сейчас
- Наконец, удалите все упоминания / файлы, связанные со старым
Uld
, и снова разверните