Rails 活动记录营业时间查询

Rails business hours query for active record

我有两个模型

OfficeTimeing < ActiveRecord::Base
  belongs_to :office
end


Office < ActiveRecord::Base
  has_many :office_timings
end

有两个字段 opening_time 和 closing_time 这些字段的字符串值类似于“09:00 AM” 我想查询如何找到当前开放的办公室 我想要这样的东西。

Office.joins(:office_timings).where("Datetime.now > office_timings.opening_time AND office_timings.closing_time > DateTime.now")

您需要使用 ?:

Datetime.now 注入到您的查询中
Office.joins(:office_timings)
  .where(
    "? > office_timings.opening_time AND office_timings.closing_time > ?",
    Datetime.now, Datetime.now
  )

每个 ? 都将安全地替换为查询字符串后面的参数。

您也可以使用 now() 在 Postgres 中直接执行此操作,并使用 BETWEEN:

使条件更易于阅读
.where("now() BETWEEN office_timings.opening_time AND office_timings.closing_time")

我不知道如何比较表示为字符串的两个时间,而不能首先在 rails 中解析它们,但是,您是否考虑过以秒为单位存储您的打开和关闭时间(从午夜开始计算) ) 而不是字符串?这样您就可以轻松编写此查询。

更新:实现此目的的一些有用方法。

获取特定时间自午夜以来的当前秒数:

seconds = specific_time.seconds_since_midnight

要将自午夜以来的秒数转换为时间对象:

time_instance = Time.at(seconds)

以09:00 AM

的形式生成字符串
time_instance.strftime("%I:%M %p")

Details about Time class.

Details about strftime.