ruby on rails validations Caricamento lento in Rails 3.2.6




ruby on rails associations (3)

Ho trovato in diverse risorse online rispetto a quando facevo cose come:

cars = Car.where(:colour => 'black')

La query non viene eseguita finché non fai qualcosa del tipo:

cars.each {|c| puts c.name } 

Tuttavia, nel mio progetto Rails 3.2.6, quando faccio ciò che segue nella console:

User.where(:first_name => "John")

Ottengo il seguente:

 User Load (1.2ms)  SELECT `users`.* FROM `users` WHERE `users`.`first_name` = 'John'

Quindi, la query viene eseguita correttamente?

Dove è andato il carico pigro? O mi sto perdendo qualcosa qui?


Questa è una domanda interessante ... La risposta è che quando si esegue qualcosa in IRB / console, chiama ispeziona l'oggetto risultante e poi lo stampa. Se hai fatto qualcosa del tipo:

User.where(:first_name => "John").class

dovresti recuperare un oggetto ActiveRecord :: Relation.

Quindi il carico pigro per Rails è ancora valido, è solo il modo in cui funziona la console.

Spero che questo ti aiuti.

Fonte (s): 1) https://rails.lighthouseapp.com/projects/8994/tickets/4951-rails-console-executes-where-queries-without-lazy-loading 2) Perché la relazione Active Record non viene restituita in console?


Ho eseguito un test utilizzando sqllite3 per tentare di scoprire se la ricerca AR Base ha effettivamente effettuato una query immediatamente. Ecco cosa ho fatto:

rows=Customer.orders.find(1,2)

Allora ho fatto:

ActiveRecord::Base.remove_connection;
p rows

Ho avuto un errore di connessione non stabilito.

Ho anche provato "p rows" subito dopo la query senza rimuovere la connessione e ottenuto le 2 file che mi aspettavo.

Questo è stato fatto con activerecord-3.1.3. La mia conclusione è che in 3.1.3 la base find aspetta di fare la query fino a quando si accede alla matrice (Relation?).

Sono nuovo a Ruby quindi il mio test potrebbe non essere progettato correttamente.


Le chiamate della console inspect il risultato di qualsiasi espressione digitato in modo che possa visualizzarla. inspect è una delle cose che attiverà il carico della query. Se invece lo fai

x = User.where(:first_name => 'John'); false

quindi non dovresti vedere nessuna query perché questa volta la console sta chiamando inspect su false anziché sull'oggetto relazione Active Record.





activerecord