ruby-on-rails - Rails - 查询时间变化
问题描述
目前我正在开发一个管理轮班的系统。
系统包含一个端点,该端点根据服务器时间返回当前班次。我创建了一个查询,该查询适用于上午 08:00 到下午 04:00 等常规班次,但挑战是从前一天晚上 10:00 到上午 06:00 的黎明班次。
我的模型包含以下字段:
- 名称(字符串)
- start_at(时间)
- end_at (时间)
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 日期。
那么,有没有一种简单/最好的方法来做到这一点?
谢谢您的帮助!
解决方案
有趣的问题!所以有两种情况:(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
推荐阅读
- database - 设计创意数据库并保持效率
- node.js - 猫鼬填充数组上的功能
- f# - 在 F# 中,如何对 Nullable 进行模式匹配
反对空? - ios - 静态快速操作在目标 c iOS 中不起作用
- java - 关于 getter/setter 方法的 Java 问题
- asp.net - Visual Studio 2019 添加区域缺失
- c# - @inject HttpClient 与 @using System.Net.Http 之间的问题;在查看页面
- firebase - Flutter:NoSuchMethodError:在 null 上调用了 getter 'length'
- python - 根据日期差异从嵌套在另一个字典中的列表中删除字典
- c++ - 是否可以将某些函数参数设为对象外部私有但内部可访问?