Domanda

Ecco il caso.

Sto scrivendo un'applicazione Rails che monitorerà la qualità dei dati su alcuni database specifici.Per fare ciò, devo essere in grado di eseguire query SQL dirette su questi database, che ovviamente non sono gli stessi utilizzati per gestire i modelli applicativi Rails.In breve, questo significa che non posso usare il trucco di passare attraverso la connessione di base ActiveRecord.

I database a cui devo connettermi non sono noti in fase di progettazione (ad esempio:Non riesco a inserire i loro dettagli in database.yaml).Piuttosto, ho un modello "database_details" che l'utente utilizzerà per inserire i dettagli dei database su cui l'applicazione eseguirà le query in fase di runtime.
Quindi la connessione a questi database è realmente dinamica e i dettagli vengono risolti solo in fase di esecuzione.

Come lo posso fare?

Grazie,
Rollo

È stato utile?

Soluzione

Ho avuto una situazione come questa in cui dovevo connettermi a centinaia di istanze diverse di un'applicazione esterna e ho creato un codice simile al seguente:

  def get_custom_connection(identifier, host, port, dbname, dbuser, password)
      eval("Custom_#{identifier} = Class::new(ActiveRecord::Base)")
      eval("Custom_#{identifier}.establish_connection(:adapter=>'mysql', :host=>'#{host}', :port=>#{port}, :database=>'#{dbname}', " +
      ":username=>'#{dbuser}', :password=>'#{password}')")  
    return eval("Custom_#{identifier}.connection")
  end

Ciò ha l'ulteriore vantaggio di non modificare la connessione ActiveRecord::Base da cui ereditano i modelli, quindi puoi eseguire SQL su questa connessione ed eliminare l'oggetto quando hai finito.

Altri suggerimenti

È possibile stabilire una connessione a livello di codice utilizzando una chiamata come questa

ActiveRecord::Base.establish_connection(
   :adapter  => "mysql",
   :host     => "localhost",
   :username => "myuser",
   :password => "mypass",
   :database => "somedatabase"
)

Come vedi puoi sostituire somedatabase con un valore database_model.database_name.lo stesso con l'adattatore e tutto il resto

Documentazione ActiveRecord::Base.establish_connection

Quindi puoi usare

ActiveRecord::Base.find_by_sql("select * ") 

per eseguire la tua query SQL.

Documentazione ActiveRecord::Base.find_by_sql

Signor Matt era giusto se incompleto

È possibile trovare ulteriori informazioni (obsolete ma comunque utili per l'approccio progettuale). Qui e ricordati di riconnetterti al database normale quando hai finito :)

Potresti essere in grado di farlo self.stabilire_connessione

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