Исправление этой ошибки: 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
.
Ответы
Ответ 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.