Rails逻辑最佳实践

时间:2014-09-22 14:43:41

标签: ruby-on-rails separation-of-concerns rails-models

我的控制器上有一些像这样的计算

@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

它有效,但非常混乱,我该怎么办?

2 个答案:

答案 0 :(得分:2)

在旅行模型上,def self.sum_food_expenses定义了一个类方法,而不是一个实例方法。你想要def sum_food_expenses。然后在控制器中,您可以拨打@travel.sum_food_expenses

编辑:此外,不要成为坚持者,但self.food_expenses.map { |e| e.value * e.amount }.sumO(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