2015-09-21 31 views
7

Załóżmy, że buduję platformę rezerwacji hoteli, a każdy rekord pokoju ma kalendarz dostępności. Typowe kryteria wyszukiwania to wyszukiwanie według czasu trwania. Gdzie użytkownik wprowadza datę początkową i końcową, a baza danych pobiera pokoje, które nie są zajęte od tego czasu.Jak wyszukiwać według czasu trwania w Algolii

Wdrożyłem bardzo naiwne podejście, w którym przechowuję zajęte dni jako tablicę dni.

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 

I wtedy po stronie klienta, dodać następujący kod JavaScript do cross-sprawdzić, czy dzień jest w 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(); 
     } 
    }); 

tak, to oczywiście nie jest dobrym sposobem, aby to zrobić , Zastanawiam się, co jest lepsze do wykorzystania w algolii i wyszukiwania według czasu trwania?

Dzięki

+5

Jestem przekonany, że to dobry sposób na rozwiązanie problemu. Wyszukiwanie dostępności jest zawsze trudne. Co przeszkadza ci w tym rozwiązaniu? – Jerska

Odpowiedz

0

nadzieję, że pomaga innym (ponieważ kwestia zwróciła dawno temu)

zawsze lepiej zrobić filtrowanie po stronie serwera i czyni wyniki. Tutaj jednym podejściem byłoby dodanie pól datetime do modelu pomieszczenia jako start_date i end_date. Tak więc, gdy użytkownik wprowadza datę rozpoczęcia i zakończenia, rekordy są pobierane na podstawie stanu zajętości w tym czasie. Jedna prosta kwerenda byłoby jak:

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

Drugim najlepszym rozwiązaniem będzie jak mieć inny model, aby zapisać dane rezerwacji pokoju z początkiem i końcem datetime dziedzinach. W ten sposób możemy mieć wiele rezerwacji pokoi dla danego pokoju i można go zapisać jednocześnie w kolekcji rezerwacji pokoju. Stąd zapytanie:

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