2013-07-08 2 views
1

У меня есть модель Garage, которая должна иметь время открытия. Но время открытия должно быть довольно гибким. Например, он может иметь разные времена для каждого дня недели, и это должно быть возможно, чтобы добавить перерывы. Но также возможно, что время не отличается или только в течение нескольких дней.Рельсы гибкие время открытия для модели

Теперь я задаюсь вопросом, что было бы хорошим способом реализовать это. Есть идеи? Я застрял на несколько дней с этим сейчас :(

ответ

3

Я не думаю, что ответы до сих пор затрагивают проблему вообще. Просто думать на ногах, но я мог бы иметь схему, как это (с примерами данных):

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 

Я думаю, что это обеспечивает гибкость, которой вы пользуетесь.

+0

Это выглядит великолепно. Спасибо. – stevecross

+0

Добавлена ​​пример реализации функции 'is_open?'. –

0

Вы могли бы сделать что-то вроде этого, используя Mongoid синтаксис для включения полей и типов:

class Garage 
    has_many :days 
end 

class Day 
    field :start, type: Datetime 
    field :end, type: Datetime 
    field :state, type: String, default: 'opened' 

    belongs_to :garage 

    def initialize(state, start, end) 
    @state = state 
    @start = start 
    @end = end 
    end 
end 
1

С точки зрения модели, идти просто:

  • гараж has_many opening_times
  • Каждый OpeningTime имеет from время и until время (например, с 6 утра до 8 вечера)

Что касается повторения, например, если вы хотите повторять раз в определенные дни, вы можете использовать флажки - например, у вас может быть временной интервал (например, 6am - 8pm) и установите флажки рядом с тем, в какие дни вы хотите применить этот временной интервал. Это будет скорее UX, чем бэкэнда.

+0

Модель «OpeningTime» была моей идеей, и, как вы сказали, я больше всего думаю о UX. Но как много времени на открытие гаража? Один на каждый день или их следует комбинировать, если время одинаковое? – stevecross

+0

Ну, я не могу быть на 100% уверен, потому что я не знаю вашего приложения, но похоже, что время группировки имеет наибольшее значение только при создании времени открытия. Если это так, нет реальной необходимости делать дополнительное обязательство группировать их вместе на бэкэнд. – varatis

+0

Что касается вашего первого вопроса, я бы предположил, что у гаража было бы ~ 7 открытий, ~ 1 в день. У вас может быть Javascript или что-то, что помогает пользователям создавать повторяющиеся времена открытия, но не отражать группы в вашем бэкэнд, если это необходимо. Если необходимо, вы можете создать модель «OpeningTimeGroup» и позволить гаражам «has_many» из них. – varatis

Смежные вопросы