2016-07-15 184 views
0

我試圖在查詢中保存一些寶貴的毫秒。Activerecord,計算多個值的分組值的平均百分比

我有一個統計表格,我計算的一個關鍵

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

一切都OK組合的一些記錄的平均值,但我還需要在同一個表的其他列的平均值(:readed_news, :logins, etc

有沒有辦法讓所有單個查詢的平均值?

我使用Postgres的

+0

不能你只取你需要的數據,並把它放在一個哈希事後做計算? – mahatmanich

+0

這是一個巨大的表格,有記錄日誌... –

+0

嘗試在你的模型上使用範圍或類方法! – mahatmanich

回答

0

您可以在average方法採用單場,但你可以做到這一點

activities = Activity.group(:company_id) 

completed_courses = activities.average(:completed_courses) 

readed_news = activities.average(:readed_news) 
etc.. 

希望這會幫助你。

+0

你試過了嗎? 'activities = Activity.group(:company_id)' 它不會工作,因爲它不是一個關係。 –

2

你可以寫select。

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)) 
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 

然後你可以嘗試合併sco PES

Activity.average_company.merge(Activity.average_readed_news) 

請查看文檔在這裏: http://guides.rubyonrails.org/active_record_querying.html