Перечислите значение по умолчанию, чтобы пропустить существующие записи.

#ruby-on-rails #enums

Вопрос:

У меня есть огромное количество записей в БД, и я хочу добавить новый столбец. Однако я не хочу устанавливать значения по умолчанию для старых существующих записей, только для новых.

Когда я установлю значение по умолчанию для миграции (как показано ниже), все старые существующие получат значение по умолчанию.

 add_column :records, :status, :integer, default: 0
 

Проблема в том, что если я добавлю значение по умолчанию только в перечисление, вот так:

 enum status: {
    to_review: 0,
    pending: 1,
    processed: 2
  }, _default: :to_review
 

Я получаю эту ошибку

 NoMethodError (undefined method `all?' for :to_review:Symbol)
 

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

Ответ №1:

Глядя на документацию здесь, кажется, что вы на правильном пути

https://api.rubyonrails.org/v6.1.4/classes/ActiveRecord/Enum.html

 enum status: { to_review: 0, pending: 1, processed: 2}, _default: :to_review
 

Примечание: Поддержка _default была добавлена в rails 6.1запрос на вытягивание

Пожалуйста, проверьте, используете ли вы поддерживаемую версию

Комментарии:

1. Ты прав! Я тщательно проверю вашу ссылку. К сожалению, мы используем 6.01. Другой альтернативой было бы использование before_save, но это был бы дополнительный обратный вызов.

2. Ну, вы всегда можете установить значение по умолчанию на уровне базы данных при переносе.