0

我正在制定小時酒店預訂應用程序。有一個peak_seasons表,其中存儲start_dateend_date。 Peak_Seasons是我應用程序中當前年份的預定義日期。每當客戶爲選定的時間進行預訂時,我都必須檢查這些時間是否屬於旺季,以便我可以爲這些時間應用不同的費率。什麼是查找給定小時是否屬於旺季的最佳方式

此操作非常頻繁,我想優化它。需要創意。我現在的僞代碼是這樣的:

def calculate_price(customer_start_time, customer_end_time) 
    price = 0 
    (customer_start_time.to_i...customer_end_time.to_i).step(1.hour) do |hour| 
    //now check if this hour belongs to peak season over here 
    if peak_seasons?(hour) 
     price += price + peak_season_price 
    else 
     price += price + standard_price 
    end 
    return price 
end 

//peak_seasons? somewhere 
def peak_seasons?(hour) 
    PeakSeason.where("start_date <= ? and end_date >= ?", hour.to_date, hour.to_date).any? 
end 

我想這時候客戶的hundreads正在檢查所選小時的價格是不是有效率的代碼,那麼它會從數據庫提取數據用於選擇每隔一小時。如何優化它?

+0

是'customer_start_time,customer_end_time' DateTime? – neydroid

+0

您可以使用'BETWEEN'查詢,'?在start_date和end_date之間。而不是查詢每個小時,您可以查詢四個可能的區間交集,最多4個查詢。 – sschmeck

+0

@neydroid是的,'customer_start_time,customer_end_time'是DateTime。 @sschmeck,謝謝,是的,我可以通過檢查間隔而不是小時來減少查詢。有什麼方法可以讓我們只需一次取得旺季並將其存儲在記憶中?它會更好嗎? –

回答

0

您可以嘗試一次選擇給定時間間隔內的所有PeakSeason記錄。

def all_peak_seasons(customer_start_time, customer_end_time) 
    PeakSeason.where(":start_time BETWEEN start_date AND end_date OR "\ 
        ":end_time BETWEEN start_date AND end_date OR "\ 
        "start_date BETWEEN :start_time AND :end_time", 
        {start_time: customer_start_time, end_time: customer_end_time}) 
end 
1

你可以通過緩存所有PeakSeason數據,並使用Interval tree創建一個超級有效的解決方案(見this answer)進行計算。但是你說「我猜這樣做效率不高」 - 說實話,我反對這種優化,除非你真的知道是性能問題。

相關問題