我试图在查询中保存一些宝贵的毫秒。
我有一个统计表,我正在计算按键分组的一些记录的平均值
Activity.group(:company_id).average(:completed_courses)
一切都很好,但我还需要同一张桌子的其他栏目的平均值(:readed_news, :logins, etc
)
有没有办法通过一次查询获得所有平均值?
我正在使用Postgres
答案 0 :(得分:2)
您可以编写选择。
Activity.group(:company_id)
.select('AVG(completed_courses) as avg_completed_courses,
AVG(readed_news) as avg_readed_news,
AVG(logins) as avg_logins')
此外,您可以编写生成选择表达式的方法:
def select_exp(attrs)
attrs.sum { |attr| ("AVG(#{attr}) as avg_#{attr},") }.chop
end
Activity.group(:company_id)
.select select_exp(%w(completed_courses readed_news logins))
答案 1 :(得分:0)
您可以在average
方法上使用单个字段,但您可以执行此操作
activities = Activity.group(:company_id)
completed_courses = activities.average(:completed_courses)
readed_news = activities.average(:readed_news)
etc..
希望这会对你有所帮助。
答案 2 :(得分:0)
在模型上使用范围或类方法:
class Activity < ActiveRecord::Base
self.average_company
group(:company_id).average(:completed_courses)
end
self.average_readed_news
group(:readed_news).average(:completed_courses)
end
end
然后致电:
Activity.average_company
Actvitity.average_readed_news
然后您可以尝试合并范围
Activity.average_company.merge(Activity.average_readed_news)
请查看此处的文档: http://guides.rubyonrails.org/active_record_querying.html