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

SubjectControllerのインデックス

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

インクルードを使用して熱心なロードを実行します。ビューファイルで、サブジェクトのすべてのユーザーを次のように表示します。

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

問題は、ユーザー数を表示するときにすべてのサブジェクトでdbヒットが発生することです。これは、 N+1クエリの問題だと思います。

私が見逃した、または間違ったことはありますか?

ところで:私はMySQLを使用しています

4

3 に答える 3

4

このcountメソッドは常にSQLCOUNTクエリを生成します。すでにすべてのエントリをロードしているので、length余分なクエリを避けるために使用してみてください。

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

カウントは常に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配列を返します。これは決してnilにはなりません。次に、sizeの代わりに試してくださいcount。したがって、コードは次のようになります。

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