Connecting Rails 3.1 con più database

A ShowNearby abbiamo fatto una migrazione molto grande a RoR 3.1 da PHP e stiamo affrontando diversi problemi che alcuni di voi potrebbero aver risolto prima.

Abbiamo grandi quantità di dati e abbiamo deciso di separare il nostro DB in diversi DB che possiamo gestire separatamente. Ad esempio, i nostri account, luoghi, registri e altri sono suddivisi in diversi database

Abbiamo bisogno di ottenere migrazioni, infissi, modelli, per giocare bene, e finora è stato abbastanza disordinato. Alcuni dei nostri requisiti per una soluzione sono accettabili:

  • un modello dovrebbe riguardare una tabella in uno dei database.
  • rake db: drop – dovrebbe rilasciare tutto il database env che specifichiamo in database.yml
  • rake db: create – dovrebbe creare tutto il database env che specifichiamo in database.yml
  • rake db: migrate – dovrebbe eseguire migrazioni verso i vari database
  • rake db: test – dovrebbe prendere i dispositivi e rilasciarli nei vari database e unità di test / funzione / ecc

Stiamo valutando la possibilità di impostare progetti di binari separati per ciascun database e collegarli a ActiveResource, ma riteniamo che non sia molto efficiente. Qualcuno di voi ha già avuto a che fare con un problema simile?

Grazie mille!!

Per la risposta di Wukerplank, puoi anche inserire i dettagli della connessione in database.yml come al solito con un nome come questo:

log_database_production: adapter: mysql host: other_host username: logmein password: supersecret database: logs 

Quindi nel tuo modello speciale:

 class AccessLog < ActiveRecord::Base establish_connection "log_database_#{Rails.env}".to_sym end 

Per mantenere quelle fastidiose credenziali dal codice dell'applicazione.

Modifica: se si desidera riutilizzare questa connessione in più modelli, è necessario creare una nuova class astratta ed ereditarla, poiché le connessioni sono strettamente accoppiate alle classi (come spiegato qui , qui e qui ) e verranno create nuove connessioni per ogni class

Se è così, imposta le cose in questo modo:

 class LogDatabase < ActiveRecord::Base self.abstract_class = true establish_connection "log_database_#{Rails.env}".to_sym end class AccessLog < LogDatabase end class CheckoutLog < LogDatabase end 

La connessione a diversi database è abbastanza semplice:

 # model in the "default" database from database.yml class Person < ActiveRecord::Base # ... your stuff here end # model in a different database class Place < ActiveRecord::Base establish_connection ( :adapter => "mysql", :host => "other_host", :username => "username", :password => "password", :database => "other_db" ) end 

Sarei cauto nell’impostare più progetti Rails poiché aggiungerai un sacco di spese generali al recupero dei dati per i tuoi controller, il che potrebbe rallentare le cose.

Per quanto riguarda le vostre domande su migrazioni, infissi, modelli ecc .: non credo che ci sarà un modo semplice, quindi per favore posta domande separate e sii il più specifico ansible.

Consolidare i DB in uno non è un’opzione? Ti renderebbe la vita molto più facile!

Trovato un ottimo post che indirizza gli altri al modo giusto di fare questo check out http://blog.bitmelt.com/2008/10/connecting-to-multiple-database-in-ruby.html

Configura qualcosa del genere:

database.yml (file di configurazione db)

 support_development: adapter: blah database: blah username: blah password: blah 

support_base.rb (un file di modello)

 class SupportBase < ActiveRecord::Base self.abstract_class = true #important! establish_connection("support_development") end 

tst_test.rb (un file di modello)

 class TstTest < SupportBase #SupportBase not ActiveRecord is important! self.table_name = 'tst_test' def self.get_test_name(id) if id = nil return '' else query = "select tst_name from tst_test where tst_id = \'#{id}\'" tst = connection.select_all(query) #select_all is important! return tst[0].fetch('tst_name') end end end 

PS, questo in realtà non copre le migrazioni, non penso che tu possa fare migrazioni su più di un DB con rake (anche se non sono sicuro che sia un 'difficile' non fare ', potrebbe essere ansible). Questo era solo un ottimo modo per connettersi e interrogare altri DB che non si controllano.

Si potrebbe anche voler aggiungere l’ambiente Rails, quindi i database di sviluppo e test non sono gli stessi.

 establish_connection "legacy_#{Rails.env}" 

Il seguente articolo suggerisce di definire nuove attività di Rake per ottenere migrazioni su più database. Ogni attività imposta la propria connessione e quindi esegue la migrazione con questa connessione e la cartella del database specifica.

Definisce anche un db:migrate familiare db:migrate che chiama le altre due attività.

Compreso qui in caso il link non sia più disponibile:

 desc "Migrate the database through scripts in db/migrate directory." namespace :db do task :migrate do Rake::Task["db:migrate_db1"].invoke Rake::Task["db:migrate_db2"].invoke end task :migrate_db1 do ActiveRecord::Base.establish_connection DB1_CONF ActiveRecord::Migrator.migrate("db/migrate/db1/") end task :migrate_db2 do ActiveRecord::Base.establish_connection DB2_CONF ActiveRecord::Migrator.migrate("db/migrate/db2/") end end 

Fonte: Ruby on Rails Connessione a più database e migrazioni

Hey questo post è vecchio ma ho trovato una soluzione su Rails 3.2 che potrebbe aiutare qualcun altro. https://stackoverflow.com/a/16542724/1447654