Поиск записей, перекрывающих диапазон в 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]}