ruby-on-rails - validations - ruby rails scope




Comprensione di come establish_connection funziona in ActiveRecord (2)

AR chiama establish_connection una sola volta, per ActiveRecord :: Base. Tutte le sottoclassi utilizzano la prima connessione.

È possibile chiamare manualmente stabilire la connessione da soli in alcune sottoclassi. Questo è molto conveniente per l'utilizzo di due database contemporaneamente, ad es

class MyMainUser < ActiveRecord::Base; end 
class MyOtherDb < ActiveRecord::Base; end
class MyOtherUser < MyOtherDb; end

MyOtherDb.establish_connection ...

MyMainUser.first # uses default db
MyOtherUser.first # uses other db

Non puoi fare query che attraverserebbero i database.

Questo codice è stato preso dalla classe gem di ActiveRecord 2.3.14 ConnectionHandler

def establish_connection(name, spec)
  @connection_pools[name] = ConnectionAdapters::ConnectionPool.new(spec)
end

Sembra che ogni volta che ruby ​​chiama establish_connection sul modello, sta creando un nuovo pool di connessioni.

La mia domanda:

Se ho 5 modelli che utilizzano establish_connection allo stesso database, Rails è abbastanza intelligente da selezionare un pool già esistente piuttosto che crearne uno nuovo con le stesse credenziali di connessione? Questo succede anche se i miei 5 modelli sono sottoclassi di qualche classe astratta che usa establish_connection ? @connection_pools sempre una connessione da @connection_pools se esiste?

Aggiornamento 1

Sto parlando di un esempio concreto. Hai 5 modelli con 5 diverse connessioni, ogni volta che Rails usa un modello esegue establish_connection . Guardando il codice in ActiveRecord, quando esegue establish_connection crea un nuovo pool con connessioni a quella specifica connessione. Quello che mi chiedo è se ogni volta che Rails chiama la connessione_stave di un modello, crea un nuovo pool o prende quello esistente.

Esempio: vieni al mio sito e vedi un elenco di prodotti. Hai appena eseguito un'azione che chiama Product.all , che esegue la registrazione su un database su Amazon. Poi, vengo alla lista dei prodotti, cosa succede? Prendo la connessione stabilita o sto creando un nuovo pool con quella connessione?

Aggiornamento 2

La mia ipotesi è che la prima volta che Rails carica i miei modelli sta creando pool con connessioni diverse. Dopo, quando uso alcuni Model.method , semplicemente afferra la connessione associata al modello ed esegue il metodo.

Non sono sicuro di cosa accada quando 2 modelli hanno due connessioni uguali (non nella classe astratta ma nella classe self). Questo produrrà due pool di connessione uguali oppure ActiveRecord è abbastanza intelligente da catturare questo caso?


Davvero non devi chiamare establish_connection su ogni modello. Puoi semplicemente fare il prossimo:

ActiveRecord::Base.establish_connection(
 { :adapter => 'mysql2',
   :database => 'some_database',
   :host => 'localhost',
   :username => 'root',
   :password => "" }
)

e avrai accesso alla connessione. (Questo pezzo di codice è stato estratto dal codice reale (tranne il nome del database :))).
Ma secondo API credo che Rails non prenda la connessione esistente da altri modelli (correggimi se sbaglio).
Anche qui c'è un link alla documentazione . Puoi leggere di più sulla connessione lì.
Spero di averti aiutato un po '.





activerecord