2016-10-09 2 views
0

Ich habe ein Venue-Modell, das has_many und accept_nested_attributes_for Working_hours.Rails - Geschäft Öffnungszeiten Schema

Das Arbeitszeitmodell:

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 

So kann ich mehr als ein working_hour Block pro Tag hinzufügen kann, wie:

Sonntag 10 - 13am Sonntag 17 Uhr - 20 Uhr

Ich weiß, dass ich Sonntag 17 Uhr - 24 Uhr und Montag 0 Uhr - 2 Uhr morgens markieren kann, aber ich möchte eine feinste Lösung. So etwas wie die Yelp-Lösung https://www.yelp.com/biz_attribute?biz_id=jnEv25Y2DosTq2sNnvmC9g

Wenn Sie Element für die Optionen wählen, wählen Sie Stunden, sie haben eine Ganzzahl (0 und 1), um am selben Tag oder am nächsten Tag zu setzen.

Wie kann ich das erreichen (ex: 20pm - 1am)?

Antwort

0

Einfach, teilen Sie diese in 2 Arbeitsstundenaufzeichnungen - eins für 20 pm-24pm Sonntag und eins für 24pm (00) zu 1am Montag. Sie müssen eine Wrapper-Methode schreiben, um Datensätze in zwei aufzuteilen, wenn Sie Datensätze in die Tabelle einfügen.

+0

Ich kenne das Vishram. =) Ich möchte eine feinste Lösung. So etwas wie die Yelp-Lösung. Ich habe meine Frage aktualisiert. – user1301037

0

Sie können einfach eine Endzeit weniger als die Startzeit zulassen. Wenn Sie also die Startzeit (12:00) Endzeit (01:00) haben, bedeutet das von Mittag bis 1 Uhr morgens.

Also ist die Abfrage "ist das Geschäft" X "um 2 Uhr am Sonntag geöffnet?" wird ein wenig komplex, aber es in einem Verfahren setzen und du bist in Ordnung ...

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) 
0

Sie auch das Modell so sind, dass die Öffnungszeiten auf Blöcke Stunde Bereiche innerhalb der Woche, die effektiv Store basiert ändern könnte zeigen Öffnen Sie Ereignisse und speichern Sie geschlossene Ereignisse.

So unter der Annahme, dass der Anfang der Woche Montag, Stunde reicht für 9-5 würde jeden Tag zu öffnen (in dem arithmetischen Verlassen den calcs zeigen):

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 

... und Öffnungszeiten für einen bestimmten Tag kann basierend darauf gefunden werden, ob es Bereiche gibt, die ihre Stundenbereiche abdecken.

Ein Geschäft, das 24 Stunden 7 Tage die Woche zu Modell wäre leicht geöffnet ist:

from   to 
0    (7*24) 

Ein Geschäft, das offen ist 24, außer zwischen 15.00 Uhr Sonntag und 07.00 Uhr Montag:

from   to 
7    (6 * 24) + 15 

Es ist nicht so, wie wir konventionell über die Präsentation der Daten denken, aber die Präsentation am Tag kann daraus ziemlich leicht abgeleitet werden.

Es macht auch "Ist der Laden jetzt geöffnet?" Logik einfach - Sie finden einen Bereich, der "jetzt" abdeckt und dann die Schließzeit anzeigen kann. Wenn keiner gefunden wird, finden Sie den nächsten Bereich und sagen "Öffnen in 6 Stunden 15 Minuten".

Verwandte Themen