2015-09-21 53 views
7

假設我正在建立一個酒店預訂平臺,並且每個房間記錄都有可用性日曆。常見的搜索標準是按持續時間進行搜索。如果用戶輸入開始日期和結束日期,並且數據庫提取從該持​​續時間未被佔用的房間。如何在阿爾戈利亞的持續時間搜索

我已經實施了一種非常天真的方法,將被佔用的天數存儲爲數天。

attribute :occupied_at_i do 
    array = [] 
    if !occupied_at.empty? 
     occupied_at.each do |date| 
      array << Time.parse(date).to_i 
     end 
    end 
    array 
end 

,然後在客戶端,我添加以下JavaScript代碼,以交叉檢查,如果這一天是在numericRefinement

// Date Filters 
$('.date-field') 
    .on('change', function() { 
     if(_.every(_.map($('.date-field'), function(date) {return _.isEmpty(date.value) }), function(n) {return n==false;})) { 
      helper.clearRefinements('occupied_at_i'); 
      var arrayOfDates = addDateFilters(); 
      _.forEach(arrayOfDates, function(n) { 
       helper.addNumericRefinement('occupied_at_i', '!=', n); 
      }); 
      showClearAllFilters(); 
      helper.search(); 
     } 
    }); 

所以,這顯然是不這樣做的好方法,我想知道什麼是更好的利用algolia和持續時間搜索?

感謝

+5

我確實相信這是解決您的問題的好方法。可用性搜索總是很難處理。這個解決方案中有什麼讓你感到不安? – Jerska

回答

0

希望這有助於其他人(因爲問題已經問長回)

它始終是最好做在服務器端過濾和渲染的結果。這裏一種方法是將datetime字段添加到房間模型start_dateend_date。因此,當用戶輸入開始日期和結束日期時,將根據該持續時間內的佔用狀態提取記錄。一個簡單的查詢會是這樣:

Room.where.not("start_date >= ? AND end_date <= ?", start_date, end_date) 

其他最好的解決辦法是想有另一種模式來拯救客房登記服務細節以及開始和結束日期時間字段。這樣,我們可以爲特定房間預訂多個房間,並且可以同時將其保存在房間預訂收藏中。因此,查詢將變爲:

Room.left_joins(:room_bookings). 
    where(
    "room_bookings.start_date > ? OR 
    room_bookings.end_date < ?", end_date, start_date 
) 
相關問題