2011-08-19 96 views
1

我有一个简单的rails应用程序,就像一个事件系统,它有一个start_at字段和一个end_at字段。我希望能够显示在当前月份为start_at个月的事件。我定义了一个范围如下所示:如何使用ActiveRecord查找日期在当前月份内的记录?

scope :this_months_event, lamda{where("start_at = ?" Time.zone.now.month)} 

每当我在控制台窗口中试用这个,我得到一个空的数组。我观察到start_at字段的月份没有被提取,所以它找不到start_at月份,所以它会返回空。

有谁知道一个好办法做到这一点还是我怎么能传递start_at个月这样,当我打电话Event.this_months_event,我得到这个目前每月的所有事件,如果可能的一个范围,以获取过去的事件,另一个用来取目前的事件。

回答

12

你的情况说,start_at应Time.zone.now.month,其中,作为这个写作是8.您想与该月的开头和结尾start_at比较准确的值:

scope :this_months_event, lambda { where("start_at >= ? AND start_at <= ?", 
    Time.zone.now.beginning_of_month, Time.zone.now.end_of_month) } 
+0

您将需要一个'lambda'有,否则你的代码可能会产生意外行为在生产,其中类缓存。 – rubish

+0

谢谢。编辑我的答案。 –

+0

非常感谢这帮助很好 – Uchenna

0

我认为start_atend_at是约会时间?如果是这样,你需要稍微复杂一些的做一些事情:

scope :this_months_event, lambda { where("EXTRACT(MONTH FROM start_at)) = ?", Time.zone.now.month) } 

http://www.postgresql.org/docs/9.0/static/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT

+1

不错,不知道关于提取月份,但是......这个范围会发现在同一个日历月中来自以前(和未来)的事件。 –

+0

你的'FROM'就像一个postgresql,但是对于sqlite来说。因为我只是试了一下,它不适用于sqlite – Uchenna

+1

是的,这段代码既不正确也不便携,但EXTRACT的东西可能非常有用。 –

相关问题