5

1 つ以上のウィジェットを持っている (または持っていない) UserProfile のリストがあります。

class UserProfile < ActiveRecord::Base
  has_many :widgets
end

@all_profiles = UserProfile.joins(:widgets).group('user_profiles.id').order("name ASC")

インデックス ビューでは、ビューの各行で新しいクエリを実行して のウィジェットの数を取得する代わりに、@all_profile.eachグループ化された各行にいくつのウィジェットがあったかを示すカウント列を元の列に追加する方法はありますか? (たとえば、N 個の @all_profiles がある場合、データベースを N 回再クエリするのを避けますか?

(これは、N 個の余分なクエリを避けるために重要であるだけでなく、count 列に SORT オプションを追加できるため、ウィジェットが最も多い顧客で並べ替えることができます)

4

2 に答える 2

13

COUNT次の方法で列を追加できますActiveRecord::QueryMethods#select

@all_profiles = UserProfile.joins(:widgets).select('user_profiles.*, COUNT(*) AS widget_count').group('user_profiles.id').order('name ASC')

これで、返された各オブジェクトには、widget_count他のモデル属性と同じようにアクセスできる属性が含まれます。

@all_profiles.each do |profile|
  puts profile.widget_count
end
于 2012-08-15T02:14:11.630 に答える
0

:group引数:countを指定して、countメソッドを使用できます。

それは次のようになります:

UserProfile.joins(:widgets).order(:name).count(:id, :group => 'user_profiles.id')
于 2012-08-15T20:40:39.653 に答える