2013-01-17 70 views
2

我使用Rails 3.2.8,並有模型Rails的:ActiveRecord的貪婪加載和N + 1查詢

class Subject < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 
class User < ActiveRecord::Base 
    has_and_belongs_to_many :subjects 
end 
在SubjectsController

,指數

@subjects = Subject.includes(:users).all 

我使用包括做的渴望負載,並在視圖文件,我想這個顯示對象的所有用戶:

<%= subject.users.count if not subject.users.nil? %> 

的問題是,我得到了分貝命中爲每subjec t當顯示用戶數,我認爲是N + 1查詢問題

什麼我錯過了或做錯了?

BTW:我使用的MySQL

回答

4

count方法總是生成SQL COUNT查詢。既然你已經加載的所有條目,嘗試使用length以避免額外的查詢:

<%= subject.users.length if not subject.users.nil? %> 
+0

我覺得@Yanhao是正確的subjects.users永遠不會是零的。 – fengd

0

首先,subject.users返回一個數組,這將永遠是零。 其次,請嘗試size而不是count。 因此,代碼可能是:

<%= subject.users.size if not subject.users.empty? %> 
+0

謝謝,但@ dimuch的答案有更多的信息爲什麼產生這麼多的查詢。 – fengd

1
<%= subject.users.count if not subject.users.nil? %> 

伯爵總是做SQL查詢,並沒有做任何緩存

長度ANS大小是彼此的別名,數量和長度之間的區別是,你可以傳遞參數來計算長度或大小,並且計數不會做任何緩存。

如下

[1,2,3].count{|x| x > 2} 
result => 1 

所以請使用下列語句

<%= subject.users.length if not subject.users.nil? %> 

<%= subject.users.size if not subject.users.nil? %>