簡體   English   中英

Rails:ActiveRecord渴望負載和N + 1查詢

[英]Rails: ActiveRecord Eager Load and N+1 Query

我正在使用Rails 3.2.8,並且有模型

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

我使用include來進行急切的加載,並且在視圖文件中,我想以此顯示主題的所有用戶:

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

問題是在顯示用戶數時,每個主題的數據庫都命中了,我認為這是N + 1查詢問題

我錯過或做錯了什么嗎?

順便說一句:我正在使用MySQL

count方法始終生成SQL COUNT查詢。 由於您已經加載了所有條目,請嘗試使用length以避免額外的查詢:

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

計數始終執行sql查詢,並且不進行任何緩存

length和size是彼此的別名,count和length之間的區別是您可以傳遞參數進行計數,但是對於length或size和count則不進行任何緩存。

如下

[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? %>

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM