2013-02-17 74 views
0

我试图找到一个user的逾期invoices如何检索Ruby on Rails中的相关记录?

class User < ActiveRecord::Base 
    def overdue_invoices 
    invoices.where("overdue = ?", true) 
    end 
end 

class Invoice < ActiveRecord::Base 
    def overdue 
    balance > 0 && Date.today > due_date 
    end 
end 

这个问题似乎是overdue是在Invoice模式,而不是数据库列的方法。

无论如何我该如何检索这些记录?这是否甚至是有意义的,还是将这些truefalse值存储在数据库中会更好?

+2

“Invoice#overdue”方法是什么样的? – 2013-02-17 14:49:19

+0

刚刚在上面添加了它。 “balance”实际上是一个数据库列。 – Tintin81 2013-02-17 15:11:22

回答

5

您应该Invoice创建overdue等同类方法或scope

class User < ActiveRecord::Base 
    def overdue_invoices 
    invoices.overdue 
    end 
end 

请注意,我假设due_date是:

class Invoice < ActiveRecord::Base 
    def self.overdue 
    where('balance > 0').where('? > due_date', Date.today) 
    end 
end 

然后你可以在发票上的关系称之为overdue一个数据库列,如果不是,则不能使用此方法 - 但是,您可以用SQL替换它以计算列中数据的到期日期。

+0

谢谢,安德鲁!这真的很好。现在我必须阅读'self'的概念,因为我不完全确定你为什么将它添加到'overdue'方法中。 – Tintin81 2013-02-17 16:47:55

+0

def self .______定义了一个类级别的方法,而不是一个实例方法。 http://www.railstips.org/blog/archives/2009/05/11/class-and-instance-methods-in-ruby/是一个很好的写法。 – 2013-02-18 05:30:08