2013-10-23 10 views
19

Wie filtere ich die Ergebnisse einer AR-Abfrage, ohne eine zusätzliche Abfrage auszuführen?Filtern auf ActiveRecord-Beziehung ohne zusätzliche SQL-Abfrage?

z.B.

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 

Ich will nicht die zweite Abfrage der DB rufen, sondern filtern auf den abgerufenen Ergebnisse in u (erste Abfrage).

Antwort

27

Die ActiveRecord:Relation fragt nur die DB, wenn ihre Elemente zugegriffen werden kann. Also wird die Sequenz, die Sie haben, die Datenbank überhaupt nicht aufrufen, außer Sie schreiben etwas wie u.first oder tens.first.

Es ist ein bisschen anders in Rails-Konsole als jede Aussage Ergebnisse werden so gedruckt, trösten sie die Abfrage jedes Mal ausgeführt wird. Sie können den Druck überspringen, indem Sie nach jeder Anweisung ; 1 anhängen.

Davon abgesehen, wenn Sie immer noch die Ergebnisse mit der ersten Abfrage filtern möchten:

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

Die Konsole ruft 'inspect' auf das zurückgegebene Objekt und druckt diese aus. Die Methode inspect für "ActiveRecord :: Relation" ruft "to_a" http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-inspect auf, welches die Datensätze http: // api lädt und zurückgibt .rubyonrails.org/classes/ActiveRecord/Relation.html # method-i-to_a, führt also bereits die erforderlichen Abfragen durch. – kristinalim

+1

Auch verwende ich '; nil' statt anhängen '; p 1 ". Nur '; 1 'wäre eigentlich schon ausreichend. – kristinalim

+0

@kristinalim wahr und besser – tihom

Verwandte Themen