Консоль Rails не загружает автоматически модели для второй БД
-
03-07-2019 - |
Вопрос
У меня есть проект Rails, в котором есть база данных Postgres для реального приложения, но которому необходимо извлечь чертовски много данных из базы данных Oracle.
база данных.yml выглядит так
development:
adapter: postgresql
database: blah blah
...
oracle_db:
adapter: oracle
database: blah blah
Мои модели, основанные на данных из базы данных Oracle, выглядят примерно так:
class LegacyDataClass < ActiveRecord::Base
establish_connection "oracle_db"
set_primary_key :legacy_data_class_id
has_one :other_legacy_class, :foreign key => :other_legacy_class_id_with_funny_column_name
...
end
Теперь по привычке я часто выполняю большую часть своей ранней разработки (и это ранняя разработка), немного кодируя, а затем играя в консоли Rails.Например, после определения всех ассоциаций для LegacyDataClass я начну пробовать такие вещи, как a = LegacyDataClass.find(:first); puts a.some_association.name
.Неожиданно это заканчивается, поскольку LegacyDataClass еще не загружен.
тогда я смогу require 'LegacyDataClass'
что устраняет проблему до тех пор, пока мне не понадобится reload!
, который на самом деле не перезагрузит его или пока я не открою новый экземпляр консоли.
Таким образом вопросы:
- Почему это происходит?Очевидно, что в Rails есть какая-то магия, которую я не понимаю.
- Чем удобен Rails обходной путь?
Решение
Я считаю, что это может быть связано с названием вашей модели, а не с вашими связями.Соглашение Rails заключается в том, что имена классов моделей — CamelCase, а файлы, в которых они находятся, — строчные буквы + подчеркивание.
Поэтому класс LegacyModel должен находиться в models/legacy_model.rb
.Ваше заявление о "require 'LegacyDataClass'"
указывает, что это не так, и поэтому Rails не знает, как автоматически загрузить эту модель.
Другие советы
Я написал что-то для приложения на работе, которое обрабатывает соединения с другими базами данных во время выполнения, возможно, это поможет.