2010-04-21 1 views
14

Quindi, ho un modello Event con una colonna starts_at e ends_at e voglio trovare eventi che si svolgono in un intervallo di date.Ricerca di record che si sovrappongono a un intervallo in Rails

mi è venuta in mente questa named_scope (range è tipicamente un mese):

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

che funziona come previsto.

Ma se un evento inizia il mese prima e termina il mese dopo l'intervallo non mostrerà. C'è un modo per trovare quegli eventi in modo corretto?

risposta

21

ci sono quattro casi:

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

tuo named_scope ottiene solo casi 1,2 e 4. Quindi, devi solo bisogno di aggiungere:

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

È grandioso! Bel diagramma anche :) – mikker

0

Immagino che un evento si sovrapponga se inizia prima dell'intervallo e termina dopo l'inizio dell'intervallo. :)

Quindi:

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