【问题标题】:Rails business hours query for active recordRails 营业时间查询活动记录
【发布时间】:2016-08-05 21:50:08
【问题描述】:

我有两个模型

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")

【问题讨论】:

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

标签: ruby-on-rails-3 postgresql ruby-on-rails-4 activerecord


【解决方案1】:

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

更新:一些有用的方法来实现这一点。

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

seconds = specific_time.seconds_since_midnight

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

time_instance = Time.at(seconds)

以 09:00 AM 的形式生成字符串

time_instance.strftime("%I:%M %p")

Details about Time class.

Details about strftime.

【讨论】:

    【解决方案2】:

    您需要使用? 将Datetime.now 注入到您的查询中:

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

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

    您也可以直接在 Postgres 中使用 now() 执行此操作,并使用 BETWEEN 使条件更易于阅读:

    .where("now() BETWEEN office_timings.opening_time AND office_timings.closing_time")
    

    【讨论】:

      猜你喜欢
      • 2013-02-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多