在Rails中查找与范围重叠的记录

15

所以,我有一个Event模型,其中包含一个starts_at和一个ends_at列,我想查找在一段日期范围内发生的事件。

我设计了这个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]} }

这个代码按预期工作。

但是,如果一个事件在范围之前的一个月开始,在范围之后的一个月结束,它将不会显示。有没有合适的方法来找到这些事件呢?

2个回答

24

有四种情况:

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

5
太棒了!图表也很好看 :) - mikker

0

我猜如果事件在范围结束之前开始并且在范围开始之后结束,那么它们就会重叠。 :)

所以:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接