按周/月/等分组& ActiveRecord的?

时间:2009-05-24 02:59:55

标签: ruby-on-rails activerecord grouping

我正在我的产品中进行静态计算。用户已经执行了许多操作,比方说发布了评论。我希望能够向他们展示他们在过去一个月或过去一年中每个月每周发布的评论数量。

有没有办法用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...}

还是有更好的方法吗?

谢谢! 奥伦

7 个答案:

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

查看组日期宝石

https://github.com/ankane/groupdate

它有最近的提交,与postgresql一起使用,可以轻松地与图表一起集成以便快速制图,并且可以使用时区!!