【问题标题】:Rails 3 ActiveRecord Query Syntax for Date Column Plus Integer Column Less Than Today's DateRails 3 ActiveRecord 查询语法为日期列加上整数列小于今天的日期
【发布时间】:2013-05-09 18:35:25
【问题描述】:

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

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

其中 date 是我的日期列,duration 是一个整数,表示事件运行的天数。上面的查询产生一个空集,以及一个 MySQL 警告“Truncated wrong DOUBLE value: '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 语法如何生成这样的查询。想法?

【问题讨论】:

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


    【解决方案1】:

    这是一个解决方案,但不是很快:

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

    如果我是你,我会更改表结构和模型。您可以使用 before_save 挂钩来更新作为事件结束的新字段(日期 + 持续时间)。你可以只使用 ActiveRecord 来获得结果,而且速度会很快。

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

    【讨论】:

    • 完美解决问题!速度在这里并不是真正的问题,因为查询是在使用 resque 和 resque-scheduler 安排的每日后台作业中完成的。我喜欢模型更改和挂钩的想法。谢谢!
    • 我也在寻找一种 Rails 方式来表达date_add()。问题在于数百万用户,这将需要将它们加载到内存中,并且可能会超出云实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多