我正在尝试为invoice
创建一个范围。它用于老化视图。
发票日期为invoice.invdate
。
这不起作用 - 它认为DateTime
是一张表:
scope :thirtydays, where("DateTime.now - DATE(invdate) < ?", 31)
这是pg错误:
missing FROM-clause entry for table "datetime"
答案 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')