2013-10-23 28 views
19

如何在不執行額外查詢的情況下過濾AR查詢的結果?在沒有附加sql查詢的情況下過濾activerecord關係?

例如

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 

我不想第二個查詢調用數據庫,而是過濾在u(第一個查詢)中檢索到的結果。

回答

27

ActiveRecord:Relation僅在訪問其元素時才查詢數據庫。因此,除非你寫了類似u.firsttens.first的東西,否則你所擁有的序列根本不會調用數據庫。

它在Rails控制檯中有點不同,因爲每個語句結果都被打印到控制檯,所以它每次都執行查詢。您可以在每個陳述後添加; 1以跳過打印。

這且不說,如果你仍然想爲過濾與第一查詢的結果:控制檯調用返回的對象,並打印了這一點,在`inspect`

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

。檢查'ActiveRecord :: Relation'的方法調用'to_a'加載並返回記錄的方法http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-inspect http:// api .rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-to_a,因此已經執行了所需的查詢。 – kristinalim

+1

另外,我使用'; nil'而不是追加'; p 1'。只是'; 1'實際上已經足夠了。 – kristinalim

+0

@kristinalim真實和更好 – tihom

相關問題