2015-09-21 30 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 
) 
相关问题