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

时间:2014-01-26 09:53:11

标签: ruby-on-rails ruby activerecord

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

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

这就是我所拥有的:

class Invoice < ActiveRecord::Base

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

end

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

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

感谢您的帮助。

3 个答案:

答案 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”的属性感兴趣,但该属性不存在。我做到了。

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

    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