【问题标题】:How to search by duration in Algolia如何在阿尔及利亚按时长搜索
【发布时间】:2015-12-17 20:50:22
【问题描述】:

假设我正在构建一个酒店预订平台,并且每个房间记录都有可用性日历。一个常见的搜索条件是按持续时间搜索。用户输入开始日期和结束日期,数据库会获取该期间内未被占用的房间。

我实现了一种非常天真的方法,将占用的天数存储为天数。

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

所以,这显然不是一个好方法,我想知道如何更好地利用 algolia 并按持续时间搜索?

谢谢

【问题讨论】:

  • 我实际上相信这是解决您的问题的好方法。可用性搜索总是很难处理。这个解决方案有什么让您不安的地方?

标签: javascript ruby-on-rails search algolia


【解决方案1】:

希望这对其他人有所帮助(因为问题已经问很久了)

最好在服务器端进行过滤并呈现结果。这里的一种方法是将datetime 字段作为start_dateend_date 添加到Room 模型。这样当用户输入开始日期和结束日期时,会根据该期间的占用状态获取记录。一个简单的查询如下:

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
  )

【讨论】:

  • 你错过了这个问题与 Algolia 相关的部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 2016-03-17
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多