rails update_all возвращает неизвестный столбец * в списке полей - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть задача миграции:

owner = Owner.first
Factory.update_all(original_owner: owner)

Возвращается ошибка:

ActiveRecord::StatementInvalid (Mysql2::Error: Unknown column 'factories.original_owner' in 'field list': UPDATE `factories` SET `factories`.`original_owner` = 1)

Я почти уверен, что столбец есть. Миграция для создания этого столбца была успешно выполнена, и я проверил в консоли.

Я могу выполнить следующую задачу:

Factory.all.each { |c| c.update(original_employee: c.employee) }

Однако, это занимает много времени, так как он проходит через всеТаблица. Я бы хотел немного оптимизировать миграцию, используя update_all, поскольку многие фабрики принадлежат одному и тому же владельцу.

Любая информация / подсказка очень ценится.

ОБНОВЛЕНИЕ: Каждый factory принадлежит owner. owner может быть person, bot или nil. Чтобы оптимизировать миграцию, фабрики делятся на 3 группы:

  • фабрики, принадлежащие nil, которые можно пропустить
  • фабрики, принадлежащие person, которые мы можем использовать each и update для обновления исходного поля владельца
  • фабрики, принадлежащие bot, которые мы можем использовать update_all

update_all, требуется явно вызвать id навладелец, который является bot. Это вызывает головную боль nil в случае, если bot еще не создан в базе данных. Поскольку nil.id выдает исключение и прерывает работу программы.

Проблема: мы используем CircleCI для запуска теста. У него еще нет тестовой базы данных, поэтому bot равно nil. Если я rails db:seed требует rails db:migrate, но rails db:migrate выдает nil исключение: (

1 Ответ

1 голос
/ 08 ноября 2019

Попробуйте:

Factory.update_all(original_owner_id: owner.id)

РЕДАКТИРОВАТЬ: Один из моих старших коллег придумал лучшую версию:

Factory.where.not(owner: nil).update_all('original_owner_id = owner_id')

, настроенную для нашего случая:

Factory.where.not(owner: [nil, 0]).update_all('original_owner_id = owner_id')

поскольку запрос (Factory.where.not(owner: [nil,0]).to_sql) ищет owner_id

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...