2009-05-24 34 views
29

我正在做一些靜態計算在我的產品。用戶已經執行了一些操作,比如發佈評論。我希望能夠向他們展示他們每週在過去一個月或過去一年每個月發佈的評論數。按周/月/ etc和ActiveRecord分組?

有沒有辦法用activerecord這樣分組?我最好手動簡單地做這件事 - 根據我自己的標準對記錄總結進行迭代?

class User < ActiveRecord::Base 
    has_many :comments 
end 

class Comments < ActiveRecord::Base 
    belongs_to :user 
end 

@user.comments(:all).map {|c| ...do my calculations here...} 

還是有一些更好的辦法?

謝謝! 奧倫

回答

26

在這種情況下,對我來說最好的解決辦法是要麼是它在直接的SQL,或者使用ActiveRecord的GROUP_BY功能:

@user.all.group_by{ |u| u.created_at.beginning_of_month } 
+10

`group_by`不是一個ActiveRecord方法,而是`Enumerable`上的Ruby方法。 – Laurens 2013-02-19 17:49:58

13

我的猜測會是這樣的:

@user.comments.count(:group => "year(created_at),month(created_at)") 

幹碼,因人而異

+0

我相信這也會在幾個月內分組 - 所以如果你有兩年的數據,所有的東西在1月份的1年和2年。我在尋找的是一種告訴24例如每個月的窗口數量,每月多少個。 – teich 2009-05-24 16:47:39

+0

您可以添加一個條件來限制年份,例如:conditions => [:created_at,「>#{24.months.ago}」]。再次,未經測試,但應該可以用這樣的東西。 – 2009-05-24 23:56:20

+0

這似乎mysql具體 – Tachyons 2016-10-24 06:16:04

2

退房的has_activity插件。

+0

感謝您的指針。看起來像has_activity只是mysql。我的生產主機是postgresql。 – teich 2009-05-24 16:46:25

16

下面是這個

@user.comments.group("year(created_at)").group("month(created_at)").count 
4

使用GROUP_BY

@user.comments.group_by(&:week) 

class User < ActiveRecord::Base 
    def week 
    some_attribute_like_date.strftime('%Y-%W') 
    end 
end 

這會給你的格式的分組列表的更完善的版本YYYY-WW

2

退房團體約會寶石

https://github.com/ankane/groupdate

它有最近的提交,與postgresql一起工作,很容易集成圖表踢,以便快速繪製圖表,並且可以和時區一起工作!