2013-07-08 52 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 

這個例子顯示了一週的每一天開放時間,並在車庫在聖誕節當天關閉異常。如果找不到date的匹配列,則應用程序邏輯將優先指定OpeningTimes並指定date列,然後恢復爲week_day

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點等至20:00)

只要重複,就像在某些日子想重複時間一樣,也可以使用複選框 - 例如,您可以有一個時間段(例如,上午6點 - 晚上8點),並在您想要應用該時段的日子旁邊有複選框。這不僅僅是後端的事情,而是UX的事情。

+0

'OpeningTime'模型也是我的想法,正如你所說我主要關注UX的事情。但是,一間車庫的開放時間是多少?每天一次,或者如果時間相同,它們應該以某種方式結合起來? – stevecross

+0

嗯,我不能100%確定,因爲我不知道你的申請,但是看起來只有在創造開放時間時,分組時間似乎是最相關的。如果是這種情況,那麼就沒有必要額外承諾在後端將它們組合在一起。 – varatis

+0

至於你的第一個問題,我想一個車庫會有~7個開放時間,每天〜1個。你可以使用一些Javascript或者其他的東西來幫助用戶創建重複的開放時間,但是除非需要,否則不會反映後端的組。如果需要,你可以創建一個'OpeningTimeGroup'模型,並讓車庫'has_many'。 – varatis