2010-04-21 6 views
14

그래서 Event 모델에는 starts_atends_at 열이 있으며 날짜 범위에서 발생하는 이벤트를 찾고 싶습니다.레일에서 범위를 오버랩하는 레코드 찾기

내가 (range는 일반적으로 달)이 named_scope을 마련했습니다

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

.

그러나 그것이 표시되지 않습니다 범위 후 월을 종료하기 전에 이벤트가 달 시작합니다. 적절한 방법으로 그 사건을 찾을 수있는 방법이 있습니까?

답변

21

네 가지 경우가 있습니다 :

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

그게 좋습니다! 좋은 다이어그램도 :) – mikker

0

범위가 끝나기 전에 이벤트가 겹치면 범위가 끝난 후 이 끝나는 것 같습니다. :)

그래서 :

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