2015-09-21 13 views
7

Diciamo che sto costruendo una piattaforma di prenotazione di hotel, e ogni record di Stanza ha un calendario di disponibilità. Un criterio di ricerca comune è la ricerca per durata. Dove gli input dell'utente iniziano la data e la data di fine e il database recupera le stanze che non sono occupate da quella durata.Come cercare per durata in Algolia

Ho implementato un approccio molto ingenuo in cui memorizzo i giorni occupati come una serie di giorni.

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 

E poi al lato client, aggiungo il seguente codice javascript per controllo incrociato se il giorno è in 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(); 
     } 
    }); 

Quindi, ovviamente, non è un buon modo per farlo , Mi chiedo cosa sia meglio sfruttare l'algolia e cercare per durata?

Grazie

+5

Credo davvero che questo sia un buon modo per affrontare il problema. La ricerca di disponibilità è sempre difficile da gestire. Cosa ti turba in questa soluzione? – Jerska

risposta

0

Spero che questo aiuta gli altri (in quanto questione ha chiesto tempo indietro)

è sempre meglio fare il filtraggio a lato server e rendere i risultati. Ecco un approccio per aggiungere i campi datetime al modello Room come start_date e end_date. In questo modo, quando gli input dell'utente iniziano la data e la data di fine, i record vengono recuperati in base allo stato occupato in quella durata. Una semplice query sarebbe come:

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

L'altra soluzione migliore sarebbe come avere un altro modello per salvare i dettagli Camera di prenotazioni con campi di inizio e fine datetime. In questo modo possiamo avere più prenotazioni di camera per una particolare stanza e può essere salvata contemporaneamente nella raccolta di prenotazione della camera. Quindi la domanda diventerebbe:

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