2013-10-23 19 views
19

Come si filtrano i risultati di una query AR senza eseguire una query aggiuntiva?Filtro sulla relazione activerecord senza ulteriore query sql?

ad es.

u = User.where(name: "bob", age: [10, 20]) 
# 1st select query to db 
u.class # ActiveRecord::Relation 
tens = u.where(age: 10) 
# 2nd select query to db 

non voglio la seconda query per chiamare il db, ma piuttosto filtrare i risultati recuperati in u (prima interrogazione).

risposta

27

Il ActiveRecord:Relation interroga solo il db quando si accede ai suoi elementi. Quindi la sequenza che hai non chiamerà il db a meno che tu non scriva qualcosa come u.first o tens.first.

È un po 'diverso nella console di Rails poiché i risultati di ogni istruzione vengono stampati su console in modo che esegua la query ogni volta. È possibile saltare la stampa aggiungendo ; 1 dopo ogni istruzione.

A parte questo, se si vuole ancora per filtrare i risultati con prima query:

u = User.where(name: "bob", age: [10, 20]) # no query at this point 
u.class # ActiveRecord::Relation 
u.first # query to db 
u.class # Array 

tens = u.select{|x| x.age == 10} # no query to db 
+1

La console chiama 'inspect' sull'oggetto e stampe questo fuori restituito. Il metodo 'inspect' per' ActiveRecord :: Relation' chiama 'to_a' http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-inspect che carica e restituisce i record http: // api .rubyonrails.org/classes/ActiveRecord/Relation.html # method-i-to_a, quindi già eseguendo le query richieste. – kristinalim

+1

Inoltre, io uso '; nil' invece di accodare '; p 1'. Proprio '; 1' sarebbe già sufficiente. – kristinalim

+0

@kristinalim true e better – tihom

Problemi correlati