我如何按天而不是按日期分组?

Mat*_*iby 18 ruby group-by ruby-on-rails ruby-on-rails-3

好的,我有

 >> list = Request.find_all_by_artist("someBand")
=> [#<Request id: 1, artist: "someBand", song: "someSong", venue: "Knebworth - Stevenage, United Kingdom", showdate: "2011-07-01", amount: nil, user_id: 2, created_at: "2011-01-01 18:14:08", updated_at: "2011-01-01 18:14:09".............
Run Code Online (Sandbox Code Playgroud)

然后

list.group_by(&:created_at).map {|k,v| [k, v.length]}.sort
=> [[Sat, 01 Jan 2011 18:14:08 UTC +00:00, 10], [Sun, 09 Jan 2011 18:34:19 UTC +00:00, 1], [Sun, 09 Jan 2011 18:38:48 UTC +00:00, 1], [Sun, 09 Jan 2011 18:51:10 UTC +00:00, 1], [Sun, 09 Jan 2011 18:52:30 UTC +00:00, 1], [Thu, 10 Feb 2011 02:22:08 UTC +00:00, 1], [Thu, 10 Feb 2011 20:02:20 UTC +00:00, 1]]
Run Code Online (Sandbox Code Playgroud)

问题是我有一些太阳,1月9日和一对夫妇在10日,而不是像这样的一个

这就是我需要的

=> [[Sat, 01 Jan 2011 18:14:08 UTC +00:00, 10], [Sun, 09 Jan 2011 18:34:19 UTC +00:00, 4], [Thu, 10 Feb 2011 20:02:20 UTC +00:00, 2]]
Run Code Online (Sandbox Code Playgroud)

Sim*_*tti 21

Time是一个非常复杂的分组对象.假设您要按创建日期而不是完整Time分组,请在模型中开始创建自定义方法以返回组条件.

该方法应该返回创建日期,可能是字符串.

def group_by_criteria
  created_at.to_date.to_s(:db)
end
Run Code Online (Sandbox Code Playgroud)

然后,按该方法分组.

list.group_by(&:group_by_criteria).map {|k,v| [k, v.length]}.sort
Run Code Online (Sandbox Code Playgroud)

  • 没有to_s的'created_at.to_date'有什么问题? (3认同)

小智 17

我认为这是一个更优雅和简单的解决方案

list.group_by{|x| x.created_at.strftime("%Y-%m-%d")} 
Run Code Online (Sandbox Code Playgroud)


laf*_*ste 8

有一个宝石:groupdate.

用法(来自文档):

User.group_by_day(:created_at).count
# {
#   2013-04-16 00:00:00 UTC => 50,
#   2013-04-17 00:00:00 UTC => 100,
#   2013-04-18 00:00:00 UTC => 34
# }
Run Code Online (Sandbox Code Playgroud)