如何对两列的总和进行计算?
在我的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