Я не думаю, что ответы до сих пор затрагивают проблему вообще. Просто думать на ногах, но я мог бы иметь схему, как это (с примерами данных):
id | garage_id | date | week_day | start_time | end_time
--------------------------------------------------------------
1 | 10 | NULL | 0 | NULL | NULL
2 | 10 | NULL | 1 | 09:00 | 17:30
3 | 10 | NULL | 2 | 09:00 | 17:30
4 | 10 | NULL | 3 | 09:00 | 17:30
5 | 10 | NULL | 4 | 09:00 | 17:30
6 | 10 | NULL | 5 | 09:00 | 17:00
7 | 10 | NULL | 6 | 11:00 | 16:00
8 | 10 | 2013-12-25 | NULL | NULL | NULL
Этот пример показывает время открытия на каждый день недели, а также исключение, где гараж закрыт на Рождество. Логика приложения будет отдавать предпочтение OpeningTimes
с указанным столбцом date
, а затем вернется к week_day
, если не найден соответствующий столбец для date
.
def is_open?
if (exc = opening_times.find_by_date(Date.today))
(exc.start_time..exc.end_time).cover?(Time.now)
else
tdy = opening_times.find_by_week_day(Date.today.wday)
(tdy.start_time..tdy.end_time).cover?(Time.now)
end
end
Я думаю, что это обеспечивает гибкость, которой вы пользуетесь.
Это выглядит великолепно. Спасибо. – stevecross
Добавлена пример реализации функции 'is_open?'. –