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

mik*_*ker 14 ruby activerecord ruby-on-rails

所以,我有一个Event有一个列starts_at和一个ends_at列的模型,我想查找在一系列日期中发生的事件.

我想出了这个named_scope(range通常是一个月):

named_scope :in_range, lambda { |range|
  {:conditions => [
    'starts_at BETWEEN ? AND ? OR ends_at BETWEEN ? AND ?',
    range.first, range.last, range.first, range.last]} }
Run Code Online (Sandbox Code Playgroud)

哪个按预期工作.

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

Ton*_*not 23

有四种情况:

     Start    End
1.      |-----|
2.  |------|
3.  |-------------|
4.         |------|
Run Code Online (Sandbox Code Playgroud)

你的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
   ]}
}
Run Code Online (Sandbox Code Playgroud)

  • 那很棒!好图也:) (4认同)