假设我正在构建一个酒店预订平台,每个房间记录都有可用性日历。一个常见的搜索条件是按持续时间搜索。在用户输入开始日期和结束日期的地方,数据库会获取在此期间未被占用的房间。
我实现了一种非常天真的方法,我将占用的天数存储为天数数组。
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 和按持续时间搜索?
谢谢
最佳答案
希望这对其他人有帮助(因为很久以前就有问题了)
最好在服务器端进行过滤并呈现结果。这里的一种方法是将 datetime
字段作为 start_date
和 end_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
)
关于javascript - 如何在 Algolia 中按持续时间搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32690395/