Так, я имею 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]} }
Который работает как ожидалось.
Но если событие запустится месяцем ранее и закончит месяц после диапазона, то это не покажет. Там какой-либо путь состоит в том, чтобы найти те события надлежащим способом?
Всего четыре случая:
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
]}
}
Я предполагаю, что событие перекрывается, если оно начинается до конца диапазона и заканчивается после начала диапазона. :)
Итак:
{:conditions => ['? < ends_at AND ? > starts_at', range.first, range.last]}