2015-09-21 22 views
7

Giả sử tôi đang xây dựng nền tảng đặt phòng khách sạn và mỗi bản ghi Phòng đều có lịch khả dụng. Một tiêu chí tìm kiếm phổ biến là tìm kiếm theo thời lượng. Trường hợp người dùng nhập ngày bắt đầu và ngày kết thúc và cơ sở dữ liệu tìm nạp các phòng không bị chiếm đóng từ thời lượng đó.Cách tìm kiếm theo thời gian trong Algolia

Tôi đã thực hiện một cách tiếp cận rất ngây thơ nơi tôi lưu trữ các ngày bị chiếm đóng dưới dạng một mảng ngày.

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 

Và sau đó ở phía khách hàng, tôi thêm mã javascript sau đây để kiểm tra chéo nếu ngày là trong 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(); 
     } 
    }); 

Vì vậy, nó rõ ràng không phải là một cách tốt để làm điều đó , Tôi tự hỏi điều gì là tốt hơn để tận dụng trên algolia và tìm kiếm theo thời gian?

Cảm ơn

+5

Tôi thực sự tin rằng đây là một cách hay để giải quyết vấn đề của bạn. Tìm kiếm khả dụng luôn khó xử lý. Điều gì làm bạn lo lắng trong giải pháp này? – Jerska

Trả lời

0

Hy vọng điều này giúp những người khác (kể từ khi câu hỏi đã hỏi dài trở lại)

nó luôn luôn tốt hơn là làm các việc lọc ở phía máy chủ và đưa ra kết quả. Dưới đây là một phương pháp để thêm datetime trường vào mô hình Phòng là start_dateend_date. Vì vậy, khi người dùng nhập ngày bắt đầu và ngày kết thúc, các bản ghi được tìm nạp dựa trên trạng thái bị chiếm đóng trong khoảng thời gian đó. Một truy vấn đơn giản sẽ là:

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

Giải pháp tốt nhất khác là muốn có một mô hình tiết kiệm chi tiết đặt phòng khác với trường ngày bắt đầu và kết thúc. Bằng cách này, chúng tôi có thể đặt nhiều phòng cho một phòng cụ thể và có thể được lưu đồng thời trong bộ sưu tập đặt phòng. Do đó truy vấn sẽ trở thành:

Room.left_joins(:room_bookings). 
    where(
    "room_bookings.start_date > ? OR 
    room_bookings.end_date < ?", end_date, start_date 
) 
Các vấn đề liên quan