2010-04-21 7 views
14

Por lo tanto, tengo un modelo Event que tiene una columna y una columna ends_at y quiero encontrar eventos que tienen lugar en un rango de fechas.Búsqueda de registros que se superponen con un rango en Rails

se me ha ocurrido con este named_scope (range es normalmente un mes):

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

que funciona como se esperaba.

Pero si un evento se inicia el mes anterior y termina el mes pasado, el rango no se mostrará. ¿Hay alguna forma de encontrar esos eventos de manera adecuada?

Respuesta

21

Hay cuatro casos:

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

Su named_scope sólo recibe casos 1,2 y 4. Por lo que sólo necesita necesidad de añadir:

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

¡Eso es genial! Buen diagrama también :) – mikker

0

Supongo que un evento se solapa si comienza antes de que el rango finalice y finaliza después de que comienza el rango. :)

Así:

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