Activerecord,计算分组值的多个值的平均百分比

时间:2016-07-15 08:27:14

标签: ruby-on-rails postgresql activerecord

我试图在查询中保存一些宝贵的毫秒。

我有一个统计表,我正在计算按键分组的一些记录的平均值

Activity.group(:company_id).average(:completed_courses)

一切都很好,但我还需要同一张桌子的其他栏目的平均值(:readed_news, :logins, etc

有没有办法通过一次查询获得所有平均值?

我正在使用Postgres

3 个答案:

答案 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