2009-06-08 7 views
7

Ho letto molte delle domande/discussioni esistenti su questo argomento, ma tieni presente che lo nessuno di questi ha direttamente indirizzato il mio problema su. Ricorda anche che questo è NON una situazione per database.yml dato che non conoscerò in anticipo le informazioni sul DB.Connettere dinamicamente un modello ai database in un'applicazione in esecuzione?

Detto questo, ho bisogno di una soluzione per DYNAMICALLY che si connetta a più database in un'applicazione Rails. La mia situazione è che ho più siti di registrazione dei dati, tutti con una semplice tabella di dati (EVENTI, TIMESTAMP, VALUE). Questi siti devono (e resteranno) come sono dovuti alle applicazioni locali che devono utilizzarli.

Quello che mi serve è creare un'applicazione che mantenga una tabella di "MYSQL_LOGINS" e utilizzi ciascuno di questi login per connettersi a uno qualsiasi dei vari database e fornire grafici/grafici per i dati contenuti.

Il mio modello "dati" rimarrà lo stesso per tutti i database MySQL a cui mi collego, ho semplicemente bisogno di poter dire al mio MODELLO di connettersi a un DB diverso al volo. Spero che questo sia incredibilmente semplice, ma vedremo.

risposta

14

Si desidera ActiveRecord::Base#establish_connection. Probabilmente si vorrà utilizzare in una sottoclasse astratta in modo che i modelli che utilizzano le connessioni manuali non disturbano la connessione utilizza per il resto della vostra applicazione:

class LogBase < ActiveRecord::Base 
    self.abstract_class = true 
end 

class LogItem < LogBase 
    ... 
end 

LogItem.establish_connection { ... } 

LogItem.find_by_ ... 

Se avrete sempre e solo avere un modello che rende le connessioni manuali la classe astratta non è necessaria.

Conosci l'intero set di database a cui è possibile connettersi? In tal caso, database.yml potrebbe comunque esserti utile. È possibile inserire tutte le informazioni in là come una directory, dando ogni database un nome, poi ha scelto in modo dinamico che uno di establish_connection con l'applicazione usando quei nomi:

# database.yml 
atlanta: 
    host: atlantadb.foo.com 

# foo.rb 
LogItem.establish_connection :atlanta 

Configurazione dei collegamenti può essere piuttosto pesante, doppiamente se i siti sono separati da una rete geografica. Prenderò in considerazione l'opportunità di utilizzare un approccio extract-transform-load e di utilizzare un cron job orario/giornaliero per copiare i dati in un sito di reporting centralizzato. Questa è la forma più elementare di un data warehouse ed è un approccio molto usato. Se stai usando MySql, lo Maatkit Sync è uno strumento piccolo e accurato, come rsync per le tabelle. In alternativa, probabilmente utilizzi un database che supporta la replica master-slave, sebbene ciò possa essere notevolmente più complicato da mantenere.

+0

In realtà, ho creato una classe che si collega semplicemente al database. Sembra funzionare bene. Sfortunatamente no, una volta distribuito non ci sarà un set "standard" di DB, sarà semplicemente su richiesta dell'utente. Inoltre, a causa della natura dei dati, l'approccio "magazzino" non funzionerà.Dati insufficienti registrati per indicare la fonte dei dati e un enorme potenziale per la duplicazione dei dati. Quindi ogni connessione "manuale" deve essere transitoria e consentire l'estrazione temporanea (ma non la conservazione) dei dati. Eccellente post tra. Grazie. –

0

Rails non supporta ancora più database fuori dalla confezione (non lo sarà mai, chissà). Dovrai in qualche modo dirottare la connessione al database in ActiveRecord per quel modello.

Here è la documentazione di registrazione attiva per questo ed ecco lo specific documentation che dovrete sostituire.

This è qualcosa che spiega davvero bene il processo.

Ci sono anche some pronto per la semiretta projects che attacca questo problema.

Problemi correlati