2013-07-09 152 views
0

我试图用scope来挑选今天发生的事件,并在接下来的7天内使用它们的开始日期和结束日期(我还处理UTC + 7的时区) :活动记录日期范围选择

# scopes for date_start within 7 days on either side 
t = Time.now.in_time_zone("Bangkok") 
scope :seven_days, lambda { where("date_start <= ? AND date_start >= ?", t+7.days, t-7.days) } 

因此,这个选项会在最近7天内启动并在接下来的7天内启动。但是我怎样才能找到一些正在运行的东西,比如2个月前,2个月后呢?所以它在未来7天(今天)仍然活跃,但在范围之外开始和结束?

谢谢!

回答

2

假设你有一个名为date_end属性:

t = Time.now.in_time_zone("Bangkok") 
scope :seven_days, lambda { 
    where("date_start >= ? AND date_start <= ? OR 
    date_start <= ? AND date_end >= ?", 
    t-7.days, t+7.days, t-7.days, t+7.days) 
} 
+0

谢谢Fabian_Winkler。你能解释一下这背后的逻辑吗?我不明白OR如何在这里工作。 – matski

+1

所以让我们使用圆括号来使逻辑更加明显: '(date_start≥?AND date_start≤?)OR(date_start≤?AND date_end≥?)' 第一部分选择在过去7天内开始的所有事件,在未来7天内开始。 第二部分将选择7天前开始的所有活动,并将在7天以上结束。 “OR”运算符(也称为逻辑析取)将两个子集连接起来。 –

+0

好,太好了。似乎工作。谢谢! – matski