Ruby group_by每7天一次

时间:2015-10-20 03:52:34

标签: ruby-on-rails ruby

如何按周开始和结束日期对记录集合进行排序?在查看strf docs之后,我能得到的最接近的是按周数分组

weeks = my_data.group_by{|x| x.created_at.strftime('%U %Y') }



 {"34 2015"=>
  [#<DoctorRecommendation:0x007fd663196ea0
    created_at: Tue, 25 Aug 2015 22:29:44 UTC +00:00,
    patient_profile_id: 104,],
 "33 2015"=>
  [#<DoctorRecommendation:0x007fd663194ce0
    created_at: Thu, 20 Aug 2015 13:41:37 UTC +00:00,
    patient_profile_id: 21,,
   #<DoctorRecommendation:0x007fd66319f500
    created_at: Tue, 18 Aug 2015 02:47:30 UTC +00:00,
    patient_profile_id: 61,
   #<DoctorRecommendation:0x007fd66319db38
    created_at: Tue, 18 Aug 2015 02:47:29 UTC +00:00,
    patient_profile_id: 85,
   ]
  }

我希望密钥为8/10/2015 - 8/16/20158/17/2015 - 8/23/2015

这种方法存在一些问题。首先是我无法将其转换回正确的日期(已尝试Date.parse("34 2015"))但收到了ArgumentError: invalid date。这种方法的第二个问题是,如果没有记录,将省略某些周。

2 个答案:

答案 0 :(得分:2)

你可以使用Rails&#39;日期扩展,以获取一周的开始和结束(可配置),并使用 要创建你的范围:

weeks = my_data.group_by do |x|
  date = x.created_at
  left = date.beginning_of_week.strftime('%-m/%-d/%Y')
  right = date.end_of_week.strftime('%-m/%-d/%Y')
  "#{left} - #{right}"
end

答案 1 :(得分:1)

这里的代码可以满足您的需求,但需要进行大量的日期解析。 Ruby的人可能会更好地优化它。

my_data.group_by do |x|
  date = Date.parse(x.created_at.strftime("%F"))
  monday = date - date.strftime("%u").to_i
  sunday = monday + 7
  "#{monday.strftime("%F")} - #{sunday.strftime("%F")}"
end

我的另一个建议是查询最小的created_at日期和今天,用ruby非常快地生成介于两者之间的所有周,然后进行查询。如果您获得所有数据,这会更慢,但如果您只需要几周的时间,则会更快。