我有一个UserProfile列表,可能(或可能没有)有一个或多个小部件:
class UserProfile < ActiveRecord::Base
has_many :widgets
end
@all_profiles = UserProfile.joins(:widgets).group('user_profiles.id').order("name ASC")
在索引视图中,没有在视图的EACH行中执行新查询以获取@all_profile.each
的小部件计数,是否有一种方法可以向原始位置添加计数列,以显示有多少小部件在每个分组的行? (例如,如果有N @all_profiles,请避免重新查询数据库N次?
(这不仅对避免N个额外查询很重要,而且它允许我们在count列上添加SORT选项,以便我们可以按最多小部件的客户进行排序)
答案 0 :(得分:12)
您可以通过ActiveRecord::QueryMethods#select
COUNT
列
@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
答案 1 :(得分:0)
您可以使用count方法,其中:group参数:count
应该看起来像:
UserProfile.joins(:widgets).order(:name).count(:id, :group => 'user_profiles.id')