Консоль Rails не загружает автоматически модели для второй БД

StackOverflow https://stackoverflow.com/questions/160954

Вопрос

У меня есть проект 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 не знает, как автоматически загрузить эту модель.

Другие советы

Я написал что-то для приложения на работе, которое обрабатывает соединения с другими базами данных во время выполнения, возможно, это поможет.

http://github.com/cherring/connection_ninja

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top