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

所以,我有一个具有starts_atends_at列的Event模型,我想查找在一系列日期中发生的事件。

我想出了这个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]} } 

哪个按预期工作。

但是如果一个事件在前一个月开始并且在该范围之后的一个月结束它将不会显示。 有没有办法以适当的方式找到这些事件?

有四种情况:

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

我猜一个事件如果在范围结束之前开始并且在范围开始之后结束则重叠。 🙂

所以:

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