Question

J'ai un projet Rails qui a une base de données Postgres pour l'application réelle mais qui doit extraire énormément de données d'une base de données Oracle.

database.yml ressemble à

development:
  adapter: postgresql
  database: blah blah
  ...

oracle_db:
  adapter: oracle
  database: blah blah

Mes modèles dérivés des données de la base de données Oracle ressemblent à

.
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

Maintenant, par habitude, je fais souvent beaucoup de mes débuts en développement (c’est un développement précoce) en codant un peu, puis en jouant dans la console Rails. Par exemple, après avoir défini toutes les associations pour LegacyDataClass, je vais commencer à essayer des choses comme a = LegacyDataClass.find (: first); met un.some_association.name . De manière inattendue, cela s’arrête alors que LegacyDataClass n’est pas déjà chargé.

Je peux alors demander à 'LegacyDataClass' qui résout le problème jusqu'à ce que je devais recharger! , ce qui ne le rechargera pas réellement, ou jusqu'à ce que j'ouvre un nouveau instance de la console.

Ainsi, les questions:

  • Pourquoi cela se produit-il? Clairement, il y a de la magie Rails que je ne comprends pas.
  • Quelle est la solution de contournement pratique de Rails ?
Était-ce utile?

La solution

Je pense que cela pourrait avoir à voir avec votre nom de modèle plutôt qu'avec votre connexion. Selon la convention Rails, les noms de classe de modèle sont CamelCase, tandis que les fichiers dans lesquels ils résident sont en minuscule + trait de soulignement.

Le " LegacyModel " La classe doit donc être dans models / legacy_model.rb . Votre déclaration sur "nécessite" LegacyDataClass "" "indique que ce n'est pas le cas et que Rails ne sait donc pas comment charger ce modèle automatiquement.

Autres conseils

J'ai écrit quelque chose pour une application au travail qui gère les connexions à d'autres bases de données lors de l'exécution, elle pourrait peut-être vous aider.

http://github.com/cherring/connection_ninja

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top