我的控制器上有一些像这样的计算
@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
作为一种解决方法,我将所有这些方法放在ApplicationController上:
def sum_food_expenses(travel)
travel.food_expenses.map { |e| e.value * e.amount }.sum
end
它有效,但非常混乱,我该怎么办?
答案 0 :(得分:2)
在旅行模型上,def self.sum_food_expenses
定义了一个类方法,而不是一个实例方法。你想要def sum_food_expenses
。然后在控制器中,您可以拨打@travel.sum_food_expenses
。
编辑:此外,不要成为坚持者,但self.food_expenses.map { |e| e.value * e.amount }.sum
为O(2n)
,但可以写为food_expenses.sum { |e| e.value * e.amount }
,只有O(n)
。
答案 1 :(得分:1)
您要做的是在旅行的实例/对象上创建一个方法。
所以在@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