Rails 3 ActiveRecord查询语法的日期列加上整数列小于今天的日期

时间:2013-05-09 18:35:26

标签: sql activerecord ruby-on-rails-3.2

我的应用程序会跟踪数据库中具有日期和持续时间的事件。我正在尝试查询状态为“即将到来”的所有事件,这些事件的日期加上持续时间小于今天。到目前为止,我已经尝试过:

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

其中date是我的日期列,duration是一个整数,表示事件运行的天数。上面的查询生成一个空集,并且MySQL警告“截断错误的DOUBLE值:'2013-05-09'

数据库目前是MySQL,但将来可能会发生变化。

我找到了一个提供正确结果的SQL查询,但由于date_add()调用,它对我来说感觉不够Railsy:

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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