所以,我有一个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]} }
按预期工作。
但如果某个活动在之前的一个月开始,而结束该活动后的月份,则该活动将不会显示。有没有办法以适当的方式找到这些事件?
答案 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]}