Как искать по продолжительности в Алголии

Допустим, я создаю платформу бронирования отелей, и каждая запись о номере имеет календарь доступности. Общим критерием поиска является поиск по продолжительности. Где пользователь вводит дату начала и дату окончания, а база данных выбирает комнаты, которые не заняты в течение этого времени.

Я реализовал очень наивный подход, когда я сохраняю занятые дни в виде массива дней.

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

Итак, это, очевидно, не лучший способ сделать это, мне интересно, что лучше использовать для алголии и поиска по продолжительности?

Спасибо


person Chris Yeung    schedule 21.09.2015    source источник
comment
Я действительно считаю, что это хороший способ решить вашу проблему. Поиск доступности всегда трудно обрабатывать. Что вас смущает в этом решении?   -  person Jerska    schedule 22.09.2015


Ответы (1)


Надеюсь, это поможет другим (поскольку вопрос задан давно)

всегда лучше выполнять фильтрацию на стороне сервера и отображать результаты. Здесь одним из подходов было бы добавление полей datetime в модель комнаты как start_date и end_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
  )
person Ashik Salman    schedule 07.03.2018
comment
вы пропустили часть, где этот вопрос связан с Алголией - person Olivier Lance; 14.01.2019