簡體   English   中英

如何通過 created_at [ruby] 分組為 2 周增量

[英]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}但不是每隔一周,從一周的星期一開始。 任何幫助將非常感激!

您可以計算當前記錄和最早記錄之間的天數,然后使用模 14

oldest_date = YourModel.minimum(:created_at).to_date
your_relation.group_by { |record| 
  (record.created_at.to_date - oldest_date).modulo(14)
}

您可以定義一個返回年和周范圍的方法,例如:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM