2015-09-21 2 views
7

Angenommen, ich baue eine Hotelbuchungsplattform, und jeder Zimmereintrag hat einen Verfügbarkeitskalender. Ein allgemeines Suchkriterium ist die Suche nach Dauer. Wenn Benutzereingaben das Datum und das Enddatum beginnen und die Datenbank Räume abruft, die von dieser Dauer nicht besetzt sind.So suchen Sie nach Dauer in Algolia

Ich habe einen sehr naiven Ansatz implementiert, wo ich die belegten Tage als ein Array von Tagen speichern.

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 

Und dann auf der Client-Seite, ich die folgende JavaScript-Code hinzufügen Quer prüfen, ob der Tag in der numericRefinement

ist
// 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(); 
     } 
    }); 

Also, es ist offensichtlich kein guter Weg, es zu tun Ich frage mich, was ist eine bessere Lösung für Algolia und Suche nach Dauer?

Dank

+5

Ich glaube tatsächlich, dies ist ein guter Weg, um Ihr Problem anzugehen. Die Verfügbarkeitssuche ist immer schwierig zu handhaben. Was stört dich bei dieser Lösung? – Jerska

Antwort

0

hoffe, das hilft anderen (seit Frage lange zurück gefragt)

es ist immer besser, die Filterung auf Server-Seite zu tun und die Ergebnisse machen. Hier wäre ein Ansatz, dem Raummodell datetime Felder wie start_date und end_date hinzuzufügen. Wenn die Benutzereingaben das Datum und das Enddatum eingeben, werden die Datensätze basierend auf dem belegten Status in dieser Dauer abgerufen. Eine einfache Abfrage wäre wie:

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

Die andere beste Lösung wäre, wie ein anderes Modell haben, um Zimmerbuchungen Details mit Start- und End-Datetime-Feldern zu speichern. Auf diese Weise können wir mehrere Zimmerreservierungen für einen bestimmten Raum vornehmen und diese gleichzeitig in der Zimmerreservierungssammlung speichern. Daher würde die Abfrage werden:

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