我正在我的产品中进行静态计算。用户已经执行了许多操作,比方说发布了评论。我希望能够向他们展示他们在过去一个月或过去一年中每个月每周发布的评论数量。
有没有办法用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...}
还是有更好的方法吗?
谢谢! 奥伦
答案 0 :(得分:79)
在Postgres中你可以这样做:
@user.comments.group("DATE_TRUNC('month', created_at)").count
得到:
{"2012-08-01 00:00:00"=>152, "2012-07-01 00:00:00"=>57, "2012-09-01 00:00:00"=>132}
它接受从“微秒”到“千禧年”的值进行分组: http://www.postgresql.org/docs/8.1/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC
答案 1 :(得分:30)
在这种情况下,对我来说最好的解决方案是在直接SQL中执行,或者使用Ruby group_by函数:
@user.all.group_by{ |u| u.created_at.beginning_of_month }
答案 2 :(得分:20)
以下是此
的更精炼版本@user.comments.group("year(created_at)").group("month(created_at)").count
答案 3 :(得分:13)
我的猜测是这样的:
@user.comments.count(:group => "year(created_at),month(created_at)")
干码,ymmv
答案 4 :(得分: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
格式的分组列表答案 5 :(得分:2)
查看has_activity插件。
答案 6 :(得分:2)