Нахождение записей, которые перекрывают диапазон в направляющих

Так, я имею Event модель, которая имеет a starts_at и a ends_at столбец и я хотим найти события, которые происходят в диапазоне дат.

Я придумал это named_scope (range обычно месяц):

named_scope :in_range, lambda { |range|
  {:conditions => [
    'starts_at BETWEEN ? AND ? OR ends_at BETWEEN ? AND ?',
    range.first, range.last, range.first, range.last]} }

Который работает как ожидалось.

Но если событие запустится месяцем ранее и закончит месяц после диапазона, то это не покажет. Там какой-либо путь состоит в том, чтобы найти те события надлежащим способом?

14
задан mikker 21 April 2010 в 12:45
поделиться

2 ответа

Всего четыре случая:

     Start    End
1.      |-----|
2.  |------|
3.  |-------------|
4.         |------|

Ваш named_scope получает только случаи 1,2 и 4. Вам просто нужно добавить:

named_scope :in_range, lambda { |range|
  {:conditions => [
     '(starts_at BETWEEN ? AND ? OR ends_at BETWEEN ? AND ?) OR (starts_at <= ? AND ends_at >= ?)',
     range.first, range.last, range.first, range.last, range.first, range.last
   ]}
}
23
ответ дан 1 December 2019 в 12:26
поделиться

Я предполагаю, что событие перекрывается, если оно начинается до конца диапазона и заканчивается после начала диапазона. :)

Итак:

{:conditions => ['? < ends_at AND ? > starts_at', range.first, range.last]}
0
ответ дан 1 December 2019 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: