如何按周开始和结束日期对记录集合进行排序?在查看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/2015
和8/17/2015 - 8/23/2015
这种方法存在一些问题。首先是我无法将其转换回正确的日期(已尝试Date.parse("34 2015")
)但收到了ArgumentError: invalid date
。这种方法的第二个问题是,如果没有记录,将省略某些周。
答案 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非常快地生成介于两者之间的所有周,然后进行查询。如果您获得所有数据,这会更慢,但如果您只需要几周的时间,则会更快。