[英]How to group into 2 week increments by created_at [ruby]
我有需要根據 created_at 日期以 2 周為增量顯示的調查回復。 輸出應該是這樣的:
{10/1:4 10/15:6 10/29:3}
...第一周是從調查響應中最早的 created_at 日期開始創建的,最后一周也是如此,但最新的 created_at 日期。 我見過像group_by{ |s| s.created_at.month}
這樣的東西 group_by{ |s| s.created_at.month}
但不是每隔一周,從一周的星期一開始。 任何幫助將非常感激!
您可以定義一個返回年和周范圍的方法,例如:
def by_year_and_by_two_weeks(my_date)
wk = my_date.strftime("%W").to_i/2
wks = [wk, wk.odd? ? wk+1 : wk - 1].sort # <== adjust this
[my_date.year, wks]
end
rails 中的%W
使用星期一作為一周的第一天。
所以,當你有你的對象時:
object.created_at #=> 2021-09-19 08:58:16.78053 +0200
by_year_and_by_two_weeks(object.created_at) #=> [2021, [17, 18]]
然后就可以使用分組的方法了。
objects.group_by { |d| by_year_and_by_two_weeks(d.created_at) }
這是值轉換后的結果示例,使其可讀:
{[2021, [20, 21]]=>[2021-10-14 09:00:17.421142 +0200, 2021-10-15 09:00:17.421224 +0200, 2021-10-06 09:00:17.421276 +0200, 2021-10-10 09:00:17.421328 +0200], [2021, [18, 19]]=>[2021-09-22 09:00:17.421385 +0200]}
當然,您可以更改by_year_and_by_two_weeks
返回值,因為它最適合您。
您的要求:
我還將添加另一個面向未來的要求:
如果我們接受這些要求,然后利用 spickermann 的modulo
思想,我們可以像這樣構建它:
start_date = first_item.created_at.to_date.prev_occurring(:monday)
your_items.group_by { |item|
item_date = item.created_at.to_date
days_from_start = item_date - start_date
biweekly_offset = days_from_start.modulo(14)
biweekly_monday = item_date - biweekly_offset
biweekly_monday
}
例子:
test_dates = [
Date.new(2021, 10, 1),
Date.new(2021, 10, 6),
Date.new(2021, 10, 10),
Date.new(2021, 10, 13),
Date.new(2021, 10, 20),
Date.new(2021, 10, 31)
]
start = test_dates.first.prev_occurring(:monday)
pp test_dates.group_by { |date|
days_from_start = date - start
biweekly_offset = days_from_start.modulo(14)
biweekly_monday = date - biweekly_offset
biweekly_monday
}
輸出:
{ Mon, 27 Sep 2021 => [Fri, 01 Oct 2021, Wed, 06 Oct 2021, Sun, 10 Oct 2021],
Mon, 11 Oct 2021 => [Wed, 13 Oct 2021, Wed, 20 Oct 2021],
Mon, 25 Oct 2021 => [Sun, 31 Oct 2021] }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.