我有一个Venue模型,其中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
这样我每天可以添加多个working_hour块,如:
周日上午10点 - 凌晨13点 周日下午17点 - 晚上20点
我知道我可以在周日下午17点 - 下午24点和周一凌晨0点到凌晨2点标记,但我想要一个最好的解决方案。类似于Yelp解决方案https://www.yelp.com/biz_attribute?biz_id=jnEv25Y2DosTq2sNnvmC9g
如果你检查选项的元素选择小时,他们有一个整数(0和1)设置为同一天或第二天。
我怎样才能实现这一点(例如:晚上20点 - 凌晨1点)?
答案 0 :(得分:0)
很简单,你将它们分成2个工作时间记录 - 一个是星期日晚上20点到晚上24点,一个是星期一晚上24点(00点)到凌晨1点。 在将记录插入表时,需要编写一个包装器方法将记录拆分为2。
答案 1 :(得分:0)
你可以简单地允许一个小于开始时间的结束时间,所以如果你有星空时间(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)
答案 2 :(得分:0)
您还可以更改模型,以便开放时间基于一周内有效显示商店开放事件和商店关闭事件的小时范围块。
因此假设一周的开始是星期一,每天开放时间范围为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分钟内打开”。