Подтвердить что ты не робот

Исправление этой ошибки: NameError (неинициализированная константа ActiveRecord:: ConnectionAdapters:: Mysql2Adapter:: Column)

Есть два приложения. В одном из приложений используется rails 4.1.2. В другом приложении используются рельсы 5.0.1. Вот как работает приложение rails 5: он проверяет, вошел ли пользователь в систему:

  • Если пользователь вошел в систему: тогда пользователь должен иметь возможность продолжить работу.
  • Если пользователь НЕ вошел в систему, он перенаправляет их в приложение rails 4 (где пользователь может войти в систему). Как только пользователь войдет в систему с помощью приложения rails 4: пользователь должен иметь возможность получить доступ к рельсам 5 без проблем.

В моем проекте Rails 5 я использую следующие камни:

gem 'mysql2', '~> 0.4.4'
gem 'activerecord-session_store', '~> 1.0'

В моем файле config/initializers/session_store.rb у меня есть следующее:

Rails.application.config.session_store :active_record_store, :key => ‘SOME_KEY’

В настоящее время: если пользователь не вошел в систему: он успешно перенаправляет пользователя. Проблема заключается в том, когда пользователь вошел в систему. Я получаю эту ошибку, когда зарегистрированный пользователь пытается получить доступ к приложению рельсов 5:

NameError (uninitialized constant ActiveRecord::ConnectionAdapters::Mysql2Adapter::Column)
  • Я замечаю, что приложение успешно подключается к базе данных
  • Приложение также имеет доступ к таблице sessions при первоначальном запросе (когда пользователь не вошел в систему).

Любые предложения о том, что вызывает эту ошибку и как ее исправить? В конечном счете: почти похоже, что rails 5 несовместимо с activerecord-session_store и mysql2.

4b9b3361

Ответ 1

В конце концов мы смогли понять это.

Модуль Marshal может сериализовать объекты ruby ​​в базу данных. Он также может десериализовать материал из базы данных, чтобы воссоздать объекты.

Когда вы сериализуете объект, появляется информация о низком уровне, которая также присутствует в нем, например, адаптер подключения mysql2.

Когда приложение Rails 5 пытается десериализовать данные, оно выдает эту ошибку, потому что константа, которая существует в адаптере подключения MySql2 для Rails 4, не существует в версии Rails 5 этого адаптера.

Наша работа заключалась в том, чтобы просто не хранить или извлекать какие-либо из сериализованных объектов из таблицы сеансов для нашего приложения rails 5. Это сделал трюк.

Если нам действительно нужно было получить сериализованные объекты из таблицы сеансов для нашего приложения rails 5: тогда я думаю, нам пришлось бы придумать собственное решение.

Надеюсь, это поможет другим в будущем!

Ответ 2

Возможно, это связано с изменениями в релизе, то есть Rails 5.0.

Как в Заметки о выпуске Ruby on Rails 5.0:

Удалена поддержка устаревшего адаптера базы данных mysql из ядра. Большинство пользователей должны иметь возможность использовать mysql2. Он будет преобразован в отдельный камень, когда мы найдем кого-нибудь, чтобы его поддерживать.

Устаревшие передачи аргументов в #tables - метод #tables некоторых адаптеров (mysql2, sqlite3) возвращает обе таблицы и представления, а другие (postgresql) просто возвращают таблицы. Чтобы их поведение было последовательным, #tables вернет только таблицы в будущем.

Разница в константе, описанная в вашем ответе, может быть связана с тем, что они собираются изменить gem для адаптера mysql2.