2015-10-28 5 views
0

Я пытаюсь вернуть результаты, которые start_dateилиend_date попадают в диапазон дат. Я использую with_all в моем запросе TS, как например:ThinkingSphinx with_all OR запрос

range = (start_date..end_date) 
with_all = { start_date: [range], end_date: [range] } 

Однако, это не работает, потому что я считаю, что это потребует какstart_date и end_date падать в пределах диапазона.

Что мне нужно сделать так, чтобы он дал результаты, если либо в start_date или end_date падение в пределах диапазона?

ответ

0

После долгих столкновений с головой, не связанной с камнем, я нашел рабочее решение.

srange = date_range[:start].to_datetime.utc.beginning_of_day.to_i 
erange = date_range[:end].to_datetime.utc.end_of_day.to_i 

# * full range falls within start_date & end_date 
# * start_date & end_date is within the full range 
# * end range is within start_date & end_date 
# * start range is within start_date & end_date 

sphinx_select = " 
*, (IF(
#{srange} >= start_date AND 
#{srange} <= end_date AND 
#{erange} >= start_date AND 
#{erange} <= end_date, 1, 0) + 

IF(
start_date >= #{srange} AND 
start_date <= #{erange} AND 
end_date >= #{srange} AND 
end_date <= #{erange}, 1, 0) + 

IF(
#{srange} <= start_date AND 
#{srange} <= end_date AND 
#{erange} >= start_date AND 
#{erange} <= end_date, 1, 0) + 

IF(
#{srange} >= start_date AND 
#{srange} <= end_date AND 
#{erange} >= start_date AND 
#{erange} >= end_date, 1, 0)) as in_date_range" 

MyModel.search('', 
       select: select, 
       where: {"in_date_range" => [1,2,3,4]})