在我的Rails应用程序的Invoice
类中,我需要找到所有逾期的发票。
我只有两个数据库列date
(类型为datetime
字段)和days_allowed
(类型为integer
字段)。
这就是我所拥有的:
class Invoice < ActiveRecord::Base
def self.overdue
where("date + days_allowed < ?", Date.today)
end
end
但它既不会抛出错误也不会返回我需要的关系。
有没有更好的方法来对两个数据库列求和,然后对其进行计算?
感谢您的帮助。
答案 0 :(得分:1)
这取决于您使用ActiveRecord的数据库适配器类型;例如,使用PostgreSQL,您可以将INTERVAL添加到任何DATETIME(也就是TIMESTAMP),它使用非常自然的语法。
TIMESTAMP '2014-01-26' + INTERVAL '3 days' = TIMESTAMP '2014-01-29'
但是,SQL本身具有您当然可以使用的DATEADD()
函数。你在用什么数据库?
这里有一个PostgreSQL wiki链接以获取更多信息。
答案 1 :(得分:1)
虽然存在可以执行此操作的特定于数据库的sql hackery,并且其他答案已经建议,但我会以不同的方式执行此操作...您对名为“date_due”的属性感兴趣,但该属性不存在。我做到了。
before_save :calculate_due_date def calculate_due_date invoice_due_on = your_other_date + days_allowed.days end
Invoice.all.each do |i| i.save end
这个答案依赖于ActiveSupport gem在Rails中给你的一些日期魔法。使用ActiveSupport,您可以执行各种日期数学运算,例如:
4.days.from_now my_birthday - 7.days
等等。那就是'days_allowed.days'方法在上面做了什么。
答案 2 :(得分:1)
如果您使用的是mysql:
def self.overdue
where("DATE_ADD(date, INTERVAL days_allowed DAY) < ?", Date.today)
end