Rails范围使用日期

时间:2013-10-25 20:58:20

标签: ruby-on-rails

我正在尝试为invoice创建一个范围。它用于老化视图。

发票日期为invoice.invdate

这不起作用 - 它认为DateTime是一张表:

 scope :thirtydays, where("DateTime.now - DATE(invdate) < ?", 31)

这是pg错误:

missing FROM-clause entry for table "datetime"

1 个答案:

答案 0 :(得分:1)

问题是你将Ruby代码作为一个String传递给where子句而不是使用String插值。

我知道你要做什么,但我认为你应该让Rails为你处理日期查询。

您可以使用以下内容简化代码:

class Invoice < ActiveRecord::Base
  def self.thirtydays
    where(invdate: 31.days.ago..DateTime.now)
  end
end

31.days.ago..DateTime.now将生成一个Range对象,以31天前的日期开始,以今天的日期结束。 Rails将根据您的数据库平台为您处理SQL日期范围调用,在本例中为Postgresql。

它将生成类似于:

的SQL语句
SELECT `invoices`.* FROM `invoices`  WHERE (`invoices`.`invdate` BETWEEN '2013-09-24 22:00:00' AND '2013-10-25 22:00:00')