2013-02-17 72 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