Rails Console non carica automaticamente i modelli per il 2o DB
-
03-07-2019 - |
Domanda
Ho un progetto Rails che ha un database Postgres per l'applicazione reale ma che deve estrarre molti dati da un database Oracle.
database.yml sembra
development:
adapter: postgresql
database: blah blah
...
oracle_db:
adapter: oracle
database: blah blah
I miei modelli che discendono dai dati su Oracle DB assomigliano a
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
Ora, per abitudine, faccio spesso molto del mio sviluppo iniziale (e questo è sviluppo iniziale) programmando un po 'e poi giocando nella console di Rails. Ad esempio, dopo aver definito tutte le associazioni per LegacyDataClass inizierò a provare cose come a = LegacyDataClass.find (: first); mette a.some_association.name
. Inaspettatamente, questo si interrompe con LegacyDataClass non già caricato.
Posso quindi richiedere 'LegacyDataClass'
che risolve il problema fino a quando non ho bisogno di ricaricare!
, che in realtà non lo ricaricherà, o fino a quando non aprirò un nuovo istanza della console.
Quindi le domande:
- Perché succede? Chiaramente c'è qualche magia di Rails che non capisco.
- Qual è la comoda soluzione soluzione alternativa ?
Soluzione
Credo che questo potrebbe avere a che fare con il nome del tuo modello, piuttosto che con la tua connessione. La convenzione di Rails prevede che i nomi delle classi dei modelli siano CamelCase, mentre i file in cui risiedono sono minuscoli + carattere di sottolineatura.
Il " LegacyModel " la classe dovrebbe quindi essere in models / legacy_model.rb
. La tua dichiarazione su " richiedi 'LegacyDataClass' "
indica che non è così, e quindi Rails non sa come caricare automagicamente quel modello.
Altri suggerimenti
Ho scritto qualcosa per un'app al lavoro che gestisce le connessioni ad altri database in fase di esecuzione, potrebbe essere di aiuto.