Domanda

Ho letto molte delle domande esistenti / thread su questo argomento, ma di tenere presente che non di loro hanno affrontato direttamente il mio problema. Anche tenere a mente che questo è non una situazione per database.yml come io non conoscerò informazioni DB in anticipo.

Detto questo, ho bisogno di una soluzione per DINAMICAMENTE di collegamento 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, VALORE). Questi siti hanno bisogno di (e volontà) restano come sono a causa di applicazioni locali che hanno bisogno di usarli.

Che cosa ho bisogno è quello di creare un'applicazione che gestisce una tabella di "MYSQL_LOGINS" e utilizza ciascuno di questi dati di accesso per la connessione a una qualsiasi delle diverse banche dati e di fornire grafici / grafici per i dati in esso.

Il mio modello "Dati" rimarrà la stessa per tutti i database MySQL a cui mi connetto, ho semplicemente bisogno di essere in grado di dire il mio modello per la connessione a un DB diverso al volo. Spero che questo è incredibilmente semplice, ma staremo a vedere.

È stato utile?

Soluzione

Si vuole ActiveRecord :: Base # establish_connection . Probabilmente si vorrà utilizzarlo 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.

Non si conosce il set completo di database che si potrebbe connettersi? Se è così, database.yml può ancora essere utile a voi. È 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 possono essere piuttosto pesante, doppiamente così se i siti sono separati da Wide Area Network. Mi piacerebbe prendere in considerazione se ha più senso usare un approccio Extract-Transform-load e utilizzare un job cron ogni ora / giorno per copiare i dati a un sito reporting centralizzato. Questa è la forma più semplice di un magazzino di dati, ed è un approccio molto comunemente usato. Se stai usando MySql, Maatkit Sync è un piccolo strumento accurato, come rsync per le tabelle. In alternativa, probabilmente si utilizza un database che supporta la replica master-slave, anche se questo può essere notevolmente più complicato da mantenere.

Altri suggerimenti

Rails non supporta più database fuori dalla scatola ancora (maggio non lo farà mai, chi lo sa). Dovrete dirottare qualche modo la connessione al database in ActiveRecord per quel modello.

Qui è la documentazione record attivo per questo, e qui è la documentazione specifica dovrete ignorare.

Questo è qualcosa che spiega in realtà il processo di bene.

Ci sono anche alcuni semi-pronto per la produzione noreferrer progetti attaccare questo problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top