【问题标题】:Rails - Business opening hours schemaRails - 营业时间架构
【发布时间】:2016-10-09 06:39:12
【问题描述】:

我有一个场地模型,它 has_many 和 accept_nested_attributes_for working_hours。

工作时间模型:

create_table "working_hours", force: :cascade do |t|
  t.integer  "day"
  t.time     "open_time"
  t.time     "close_time"
  t.integer  "venue_id"
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
  t.index ["merchant_id"], name: "index_working_hours_on_merchant_id", using: :btree
end

这样我每天可以添加多个工作时间块,如:

周日上午 10 点至上午 13 点 周日 17pm - 20pm

我知道我可以标记周日下午 17 点至下午 24 点和周一凌晨 0 点至凌晨 2 点,但我想要一个最好的解决方案。类似于 Yelp 解决方案 https://www.yelp.com/biz_attribute?biz_id=jnEv25Y2DosTq2sNnvmC9g

如果您检查元素的选项选择小时,他们有一个整数(0 和 1)设置为同一天或第二天。

我怎样才能做到这一点(例如:下午 20 点 - 凌晨 1 点)?

【问题讨论】:

    标签: ruby-on-rails database postgresql


    【解决方案1】:

    很简单,您可以将它们分成 2 个工作时间记录 - 一个用于周日晚上 20 点至下午 24 点,另一个用于下午 24 点 (00) 至周一凌晨 1 点。 当您向表中插入记录时,您需要编写一个包装方法将记录拆分为 2。

    【讨论】:

    • 我知道那个维什拉姆。 =) 我想要一个最好的解决方案。类似于 Yelp 的解决方案。我更新了我的问题。
    【解决方案2】:

    您可以简单地允许结束时间小于开始时间,因此如果您有开始时间 (12:00) 结束时间 (01:00),这意味着从中午到凌晨 1 点。

    所以,查询“商店“X”在周日凌晨 2 点开门吗?”变得有点复杂,但把它放在一个方法中,你就没事了......

    previous_day = day == 0 ?  6 : day - 1
    
    venue.working_hours.where('day is ? AND open_time < close_time AND open_time <= ? AND close time >= ?) OR (day is ? AND open_time > close_time AND open_time <= ?) OR (day is ? AND open_time > close_time AND close_time >= ?)', day, time, time, day, time, previous_day, time)
    

    【讨论】:

      【解决方案3】:

      您还可以更改模型,以便营业时间基于一周内的时段范围,有效地显示商店开放事件和商店关闭事件。

      因此假设一周的开始是星期一,每天 9-5 的营业时间范围将是(留下算术以显示计算):

      from          to
      9             17
      (1 * 24) + 9   (1 * 24) + 17
      (2 * 24) + 9   (2 * 24) + 17
      (3 * 24) + 9   (3 * 24) + 17
      (4 * 24) + 9   (4 * 24) + 17
      (5 * 24) + 9   (5 * 24) + 17
      (6 * 24) + 9   (6 * 24) + 17
      

      ...可以根据是否存在覆盖其小时范围的范围来找到给定日期的开放时间。

      一周 7 天 24 小时营业的商店很容易建模:

      from          to
      0             (7*24)
      

      一家 24 小时营业的商店,周日下午 3 点到周一早上 7 点之间除外:

      from          to
      7             (6 * 24) + 15
      

      这不是我们通常认为的数据呈现方式,但可以很容易地从中推断出每天的呈现方式。

      它也使“商店现在开门了吗?”逻辑很简单——你找到一个涵盖“现在”的范围,然后可以显示结束时间。如果没有找到,您会找到下一个范围并说“6 小时 15 分钟后开始营业”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-05
        • 2018-01-21
        • 2015-04-11
        • 2014-05-31
        • 2011-02-12
        • 1970-01-01
        相关资源
        最近更新 更多