繁体   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