2010-04-21 51 views
14

因此,我有一個Event模型,其中包含starts_atends_at列,我想查找在某個日期範圍內發生的事件。查找與Rails中的範圍重疊的記錄

我想出這個named_scoperange通常是一個月):

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 2010-04-21 14:36:25

0

我想事件重疊,如果它開始之前範圍結束結束後範圍開始。 :)

所以:

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