繁体   English   中英

如何在Rails中将Beginning_of_day方法偏移4小时

[英]How to offset the beginning_of_day method in Rails by 4 hours

我创建了一个事件列表应用程序,事件一旦过期便消失。 例如,用户可能会在1月28日晚上9点至晚上11点看到一场音乐会。 从1月28日凌晨12点到晚上10:59,该事件将显示。 晚上11点,活动结束了。

从1月28日晚上10点到1月29日凌晨2点,一家夜总会也会举办类似的活动。 目前,即使在1月29日凌晨12点,该夜总会的活动仍在进行中,但该活动已消失。

我有一个范围检查事件是否在特定的一天,但它不返回清晨事件。

scope :on, lambda {|date|
  raw_sql = '("event_occurrences"."start_time" BETWEEN ? AND ?) OR ("event_occurrences"."end_time" BETWEEN ? AND ?)'
  scope = includes(:occurrences)
  scope.where(raw_sql, date.beginning_of_day, date.end_of_day + 4.hours, date.beginning_of_day, date.end_of_day + 4.hours)
}

我认为,重写begin_of_day和end_of_day方法,使一天从凌晨4点开始而不是凌晨12点开始是更好的方法,因为它可以准确反映夜生活(有余地)。

由于用户可以看到“今天”和“明天”的事件,因此可以使用户体验更好。 如果我的补偿工作正常(上面的代码),则1月29日凌晨1点“今天”将显示夜总会,但同时还将显示1月29日晚上9点开始的音乐会。这些音乐会应显示为“明天”。

我将如何构建覆盖这些方法的实用程序类?

您基本上希望所有从给定日期开始并在给定日期时间之后结束的事件。

我将使用这样的范围链,它将收到一个日期时间并返回与该条件匹配的那些记录:

scope :active_on, ->(dt) { where("(start_time BETWEEN ? AND ?) OR (end_time BETWEEN ? AND ?)", dt.beginning_of_day, dt.end_of_day, dt.beginning_of_day, dt.end_of_day) }
scope :active_for_datetime, ->(dt) { active_on(dt).where("end_time > ?", dt) }

然后,您可以调用范围.active_for_datetime(whenever).active_for_datetime(whenever)传递日期时间或任何其他特定时刻。

将“ beginning_of_day更改为凌晨4点只是个想法。 不要那样做

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM