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")
我有两个模型
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")