2

我正在使用 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

我使用包含来进行急切加载,并且在视图文件中,我想通过以下方式显示主题的所有用户:

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

问题是在显示用户数时我对每个主题都有 db hit,我认为这是N+1查询问题

我错过了什么或做错了什么?

顺便说一句:我正在使用 MySQL

4

3 回答 3

4

count方法总是生成 SQL COUNT 查询。由于您已经加载了所有条目,请尽量使用length以避免额外的查询:

<%= subject.users.length if not subject.users.nil? %>
于 2013-01-17T06:54:15.717 回答
1
<%= subject.users.count if not subject.users.nil? %>

count总是做sql查询,不做任何缓存

长度和大小是彼此的别名,计数和长度之间的区别在于您可以将参数传递给计数,但长度或大小和计数不做任何缓存。

如下

[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? %>
于 2013-01-17T07:17:08.547 回答
0

首先,subject.users返回一个永远不会为零的数组。其次,尝试size代替count. 所以代码可能是:

<%= subject.users.size if not subject.users.empty? %>
于 2013-01-17T06:55:42.817 回答