2012-08-11 113 views
0

合同has_many發票。創建合同後,模型會根據特定的表單參數自動創建發票。Rails從模型實例中獲取最新的兒童記錄

我希望能夠從給定合同中選擇最近創建的發票。

此我想達到什麼樣的:

contract = Contract.new(params) 
contract.save 

invoice = contract.invoices.most_recent # < wanting to get the most recent 

#or possible even do this if it's quicker 
invoice = contract.most_recent_invoice 

哪種方法是最擅長的,什麼是去這樣做的最佳方式? Rails是否有內置方法?我只想學習和維護最佳實踐。

謝謝!

回答

1

我想補充一個類的方法,通過created_at預定他們的發票模型並返回第一個:

class Invoice < ActiveRecord::Base 
    def self.most_recent 
    order('created_at DESC').limit(1).first 
    end 
end 

invoice = contract.invoices.most_recent # => Gives the last invoice created for this contract 
+0

這正是我其實是試圖做的,但我離開過方法名的'self.',因爲我不打算試圖直接類名稱訪問它。謹慎解釋?如果沒有,那麼至少它現在正在工作,因爲我想現在:)謝謝 – 2012-08-11 18:16:35

+1

這是Rails在我看來的缺點之一。將集合方法定義爲類方法確實令人困惑,特別是因爲範圍完全相同,但語法不同。任何你聲明爲類方法的方法都會被「應用」到關係中,這就是爲什麼這會起作用。幾個月前我寫了一種概念證明gem,叫做[Herd](https://github.com/beerlington/herd),它允許你在一個單獨的類中定義集合方法。我不建議您將它用於製作,但如果您有興趣探索源代碼,那麼它就在那裏。 – 2012-08-11 18:22:11

+0

感謝您的額外提示;非常好知道。 – 2012-08-11 18:30:23

0

通過created_at爲most_recent_invoice訂單創建範圍,並創建limit範圍,這將限制無記錄(最佳實踐)

1

您可以嘗試last方法。例如:

contract = Contract.new(params) 
contract.save 

invoice = contract.invoices.last 
+0

我打算提出這個建議,但我不認爲它保證它是最後創建的發票(也許取決於數據庫?)。 – 2012-08-11 18:09:32

+0

很高興知道!感謝你的回答! – 2012-08-11 18:18:24

+0

您可以爲'has_many'關係指定':order'參數,以確保項目的排序。 – Baldrick 2012-08-11 18:20:14