Поиск записей, которые перекрывают диапазон в Rails - PullRequest
14 голосов
/ 21 апреля 2010

Итак, у меня есть модель 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]} }

Который работает как положено.

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

Ответы [ 2 ]

23 голосов
/ 21 апреля 2010

Есть четыре случая:

     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
   ]}
}
0 голосов
/ 21 апреля 2010

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

Итак:

{:conditions => ['? < ends_at AND ? > starts_at', range.first, range.last]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...