[英]Rails logic best practices
我對我的控制器進行了一些計算
@travel.food_expenses.map { |e| e.value * e.amount }.sum
我知道我不應該在控制器上有應用程序邏輯,所以我在Travel模型上創建了一個方法
def self.sum_food_expenses
self.food_expenses.map { |e| e.value * e.amount }.sum
end
但是這將返回undefined method sum_food_expenses for TravelsController
的undefined method sum_food_expenses for TravelsController
作為一種解決方法,我將所有這些方法放在ApplicationController上:
def sum_food_expenses(travel)
travel.food_expenses.map { |e| e.value * e.amount }.sum
end
它有效,但非常混亂,我該怎么辦?
在旅行模型上, def self.sum_food_expenses
定義了一個類方法,而不是一個實例方法。 你想要def sum_food_expenses
。 然后在控制器中你可以調用@travel.sum_food_expenses
。
編輯:另外,不要成為一個堅持者,而是self.food_expenses.map { |e| e.value * e.amount }.sum
self.food_expenses.map { |e| e.value * e.amount }.sum
是O(2n)
,但可以寫為food_expenses.sum { |e| e.value * e.amount }
food_expenses.sum { |e| e.value * e.amount }
,只有O(n)
。
你要做的是在Travel的實例/對象上創建一個方法。
所以在@travel.sum_food_expenses
, sum_food_expenses
是一個實例方法,可以寫成
def sum_food_expenses
food_expenses.map { |e| e.value * e.amount }.sum
end
然而,如果你想使用類方法做類似的事情,那么使用self.your_method
這使得這個電話看起來像Travel.your_method
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.