如何对两列的总和进行计算?

在我的Rails应用程序的Invoice类中,我需要找到所有逾期的发票。

我只有两个数据库列, date (类型为datetime字段)和days_allowed (类型为integer字段)。

这就是我所拥有的:

 class Invoice < ActiveRecord::Base def self.overdue where("date + days_allowed < ?", Date.today) end end 

但它既不会抛出错误也不会返回我需要的关系。

有没有更好的方法来汇总两个数据库列,然后对其进行计算?

谢谢你的帮助。

虽然存在可以执行此操作的特定于数据库的sql hackery,并且其他答案已经提出,但我会以不同的方式执行此操作…您对名为“date_due”的属性感兴趣,但该属性不存在。 我做到了。

  • 添加一个将invoice_due_on字段添加到表中的迁移
  • 在你的模型中添加一个before_save钩子,如下所示:

     before_save:calculate_due_date

     def calculate_due_date
       invoice_due_on = your_other_date + days_allowed.days
    结束

  • 做一些事情来触发所有现有发票,让他们保存,更新新字段。 例如,从控制台:
     Invoice.all.each do | i |
       i.save
    结束

这个答案依赖于ActiveSupport gem在Rails中给你的一些日期魔法。 使用ActiveSupport,您可以执行各种日期数学运算,例如:

     4.days.from_now
     my_birthday  -  7.days

等等。 那就是’days_allowed.days’方法在上面做了什么。

这取决于您使用ActiveRecord的数据库适配器类型; 例如,使用PostgreSQL,您可以将INTERVAL添加到任何DATETIME(aka TIMESTAMP),它使用非常自然的语法。 TIMESTAMP '2014-01-26' + INTERVAL '3 days' = TIMESTAMP '2014-01-29'然而,SQL本身有一个你当然可以使用的DATEADD()函数。 你用的是什么数据库?

这里有一个PostgreSQL wiki链接以获取更多信息。

如果您使用的是mysql,请试一试:

 def self.overdue where("DATE_ADD(date, INTERVAL days_allowed DAY) < ?", Date.today) end