首页 > 解决方案 > Rails - 查询时间变化

问题描述

目前我正在开发一个管理轮班的系统。

系统包含一个端点,该端点根据服务器时间返回当前班次。我创建了一个查询,该查询适用于上午 08:00 到下午 04:00 等常规班次,但挑战是从前一天晚上 10:00 到上午 06:00 的黎明班次。

我的模型包含以下字段:

Ps.:我使用 Postgres 作为数据库。

我的代码:

class Shift < ApplicationRecord
  def self.current
    current_time = Time.now()
    current_time = current_time.change(year: 2000, month: 1, day: 1)

    @current ||= Shift
                  .where('start_time <= ?', current_time)
                  .where('end_time >= ?', current_time)
                  .first()
  end
end

Ps.:我想,由于我在数据库中使用 Time 类型,我必须规范化Time.now以使用 2000 - 01 - 01 日期。

那么,有没有一种简单/最好的方法来做到这一点?

谢谢您的帮助!

标签: ruby-on-railsrubypostgresqlactiverecordtime

解决方案


有趣的问题!所以有两种情况:(1) 正常班次 (where start_time <= end_time),和 (2) 与午夜重叠的班次 (where start_time > end_time)。

您已经通过检查当前时间是否在开始时间和结束时间之间来处理第一种情况。

我相信第二种情况可以通过检查当前时间是开始时间和午夜之间,还是在午夜和结束时间之间来处理。翻译为start_time <= ? OR end_time >= ?.

我有一段时间没有使用 Rails,但我认为你可以这样做:

@current ||= Shift
  .where('start_time <= end_time')
  .where('start_time <= ?', current_time)
  .where('end_time >= ?', current_time)
  .or(Shift
    .where('start_time > end_time')
    .or(Shift
      .where('start_time <= ?', current_time)
      .where('end_time >= ?', current_time)))
  .first()

如果你这样做,考虑将这两种情况分成不同的范围,这样你就可以在这个方法中写一些更易读的东西:

@current ||= current_normal_shifts.or(current_dawn_shifts).first

推荐阅读