2013-05-09 67 views
0

我的应用程序跟踪数据库中具有日期和持续时间的事件。我试图查询所有事件的状态为“即将到来”,其日期和持续时间均小于今天。到目前为止,我曾尝试:Rails 3 ActiveRecord查询语法日期列加整数列小于今日日期

events = Event.where('status = "Upcoming" and date <= (? + duration)', Date.parse(Time.now.to_s)) 

其中date是我的日期栏,和持续时间是表示天的事件运行数量的整数。上面的查询会产生一个空集和MySQL的警告“截断不正确DOUBLE值:‘2013年5月9日’

数据库当前MySQL,但是在未来可能改变

我发现了一个SQL查询。这将提供正确的结果,但它并不感到Railsy足以让我因DATE_ADD()调用:

SELECT `events`.* FROM `events` WHERE (status = "Upcoming" and date_add(date, interval 2 day) <= '2013-05-09'); 

如果让我来,我会使用DATE_ADD()函数,但我不知道Rails语法如何产生这样的查询。想法?

回答

0

这是一个解决方案,但不是一个非常快的:

Event.where(status: 'Upcoming').select{|e| (e.date + e.duration.days) < Date.today} 

如果我是你,我会改变表结构和模型。您可以使用before_save钩子更新事件结束的新字段(date + duration.days)。比你可以使用ActiveRecord来获得结果,它会很快。

看看 http://xyzpub.com/en/ruby-on-rails/3.2/ar_sonstiges.html#ar_callbacks 有关before_save回调的更多信息。

+0

完美解决问题!速度并不是真正的问题,因为查询是在使用resque和resque-scheduler调度的每日后台作业中完成的。我喜欢模型变化和钩子的想法。谢谢! – 2013-05-11 15:39:10

+0

我正在寻找Rails的方式来表示'date_add()'。问题在于数百万用户,这需要将它们加载到内存中并可能超出云实例。 – Chloe 2016-01-21 20:54:23