2016-10-09 3 views
0

私はhas_manyとaccept_nested_attributes_for working_hoursというVenueモデルを持っています。Rails - 営業時間スキーマ

労働時間モデル:

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時 - 13am 日曜日17pm - 20PM

私が知っています月曜日の午後17時〜午後24時と午前0時〜午前2時にマークすることができますが、私は最高の解決策が必要です。 https://www.yelp.com/biz_attribute?biz_id=jnEv25Y2DosTq2sNnvmC9g

オプションの要素を調べる場合、時間を選択すると、同じ日または翌日に設定する整数(0と1)があります。

どのように達成できますか(例:午後20時〜午前1時)?

答えて

0

簡単に、これらを2つの作業時間レコードに分割します.1つは日曜日の午後20時から24時まで、1つは月曜日の午後1時までです。 レコードをテーブルに挿入するときに、レコードを2に分割するラッパーメソッドを記述する必要があります。

+0

私はそのvishramを知っています。 =) 私は最高のソリューションを求めています。 Yelpソリューションのようなもの。 私の質問が更新されました。 – user1301037

0

開始時間よりも短い終了時間を許可することができます。そのため、正午から午前1時を意味する星時間(12:00)終了時刻(01:00)がある場合は、

したがって、「店舗は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) 
0

また、モデルを変更することができますイベントを開き、クローズイベントを保存します。

だから、毎日9-5時間のために範囲を開く、週の開始日が月曜日であると仮定すると(CALCSを表示するには、算術を残して)次のようになります。

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 

...と営業時間その時間範囲をカバーする範囲があるかどうかに基づいて、特定の日のために見つけることができる。

24時間、週7日は、モデルに簡単だろう開いているお店:

from   to 
0    (7*24) 

午後3時日曜日と午前7時間を除いて、1日24時間月曜日開いているお店:

from   to 
7    (6 * 24) + 15 

慣習的にデータの表示を考える方法ではありませんが、1日のプレゼンテーションはかなり簡単に推測できます。

「店舗は今開いていますか?」ロジックシンプル - 「今」をカバーする範囲を見つけて、終了時刻を表示できます。何も見つからなければ、次の範囲を見つけて「6時間15分で開く」と言う。

関連する問題