5

我有一个 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 额外查询很重要,而且允许我们在计数列上添加一个 SORT 选项,以便我们可以按拥有最多小部件的客户进行排序)

4

2 回答 2

13

您可以通过添加一COUNTActiveRecord::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 回答