我的应用程序会跟踪数据库中具有日期和持续时间的事件。我正在尝试查询状态为“即将到来”的所有事件,这些事件的日期加上持续时间小于今天。到目前为止,我已经尝试过:
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语法如何产生这样的查询。想法?
答案 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
回调的详细信息。