Поиск записей, перекрывающих диапазон в Rails

Итак, у меня есть модель Event, у которой есть столбец starts_at и 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]} }

Работает так, как ожидалось.

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

Ответы

Ответ 1

Существует четыре случая:

     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
   ]}
}

Ответ 2

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

Итак:

{:conditions => ['? < ends_at AND ? > starts_at', range.first, range.last]}