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

时间:2010-04-21 12:03:21

标签: ruby-on-rails ruby activerecord

所以,我有一个Event模型,其中包含starts_atends_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 个答案:

答案 0 :(得分:23)

有四种情况:

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

答案 1 :(得分:0)

如果事件在范围结束之前开始并且在范围开始后结束,则我认为事件重叠。 :)

所以:

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