2011-04-28 83 views
0

我幾乎不懂軌道,更不用說紅寶石,所以這可能是一個簡單的。在我的控制器的show動作之一,我有我已經定義來計算總的一些項目的變量,看起來是這樣的:從(很快瘦)的控制器移動到(不太胖)模型

@total_of_items = SomeModel.where(:user_id => @user).sum(:amount) 

這顯然收集所有量的屬性,這個特殊的用戶,並增加了他們向上。所以在我看來我只是打電話:

<%= @total_of_items %> 

它顯示出來。所以有兩個問題。首先,這真的是做這種事情的最佳方式嗎?因爲我可能想要取這個值並在另一個用戶的視圖中顯示它來比較兩者,或者類似的東西。這似乎是爲了做到這一點,這必須是模型中的一種方法?我只是不確定。

我的第二個問題是如何獲取控制器中定義的變量並將其放入模型中。看起來這是更「瘦瘦的控制器胖模式」的做事方式。幫助不大?

回答

0

您可以通過創建一個範圍(如@apneadiving證明)簡化控制器,或由一個封裝查詢的方法:

def self.amount_sum(user) 
    where(:user_id => user).sum(:amount) 
end 

然後在你的控制器:

@total_of_items = SomeModel.amount_sum(@user) 

在這種情況下,我會使用該方法,因爲範圍有點難以閱讀。瑞安貝茨使注意到這一點在他的Railscast 215

在我們使用 拉姆達第二個命名範圍。如果您在指定範圍內使用這些 其中之一,則可能會考慮使用 而不是 ,尤其是如果您傳入大量參數或 內容是複雜的。我們的 是相當簡單的,但我們將它變成一個類方法無論如何變成 。

你的情況很簡單,但我會考慮將邏輯放在類方法中。

+0

我更喜歡使用範圍,因爲它們更清楚地表達意圖。所以我會建議使用@ apneadiving的答案;) – nathanvda 2011-04-29 00:09:36

相關問題