Ruby on Rails:如何结合日期时间字段查询两小时前预订数据
查询两小时前的预订数据(基于Active Support)
你的原代码Booking.where([booking_time], 2.hours.ago.to_datetime)存在几个问题:无对应booking_time字段、未处理日期与时间字段的合并逻辑、where语法错误。以下是正确的实现方案:
由于数据表将日期和时间拆分为booking_date(日期类型)和booking_time_from(时间类型)两个字段,需要先将二者合并为完整的datetime值,再与两小时前的时间做比较。
按数据库类型选择查询语句
PostgreSQL
# 合并日期+时间,筛选出开始时间早于两小时前的记录 Booking.where("(booking_date + booking_time_from) < ?", 2.hours.ago)
MySQL
# 用TIMESTAMP函数合并日期和时间字段 Booking.where("TIMESTAMP(booking_date, booking_time_from) < ?", 2.hours.ago)
封装为模型Scope(通用写法)
可以在Booking模型里定义可复用的查询范围,自动适配数据库类型:
class Booking < ApplicationRecord scope :started_before_two_hours_ago, -> { adapter = ActiveRecord::Base.connection.adapter_name.downcase case adapter when 'postgresql' where("(booking_date + booking_time_from) < ?", 2.hours.ago) when 'mysql2' where("TIMESTAMP(booking_date, booking_time_from) < ?", 2.hours.ago) end } end
调用时直接用Booking.started_before_two_hours_ago即可获取目标数据。
关键说明
2.hours.ago是Active Support提供的便捷方法,会自动生成当前时间往前推两小时的Time对象,Rails会自动转换为数据库兼容的格式,无需手动调用to_datetime- 若需求是筛选结束时间在两小时前的记录,只需将上述代码中的
booking_time_from替换为booking_time_to - 确保
booking_date为Date类型,booking_time_from/booking_time_to为Time类型或可被数据库解析的字符串类型
内容的提问来源于stack exchange,提问作者Ryan Tran
相关产品推荐
相关产品推荐

