【问题标题】:Rails logic best practicesRails 逻辑最佳实践
【发布时间】:2014-09-22 14:43:40
【问题描述】:

我在我的控制器上进行了一些这样的计算

@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

它可以工作,但它非常非常混乱,我应该如何进行?

【问题讨论】:

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


    【解决方案1】:

    在旅行模型上,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)

    【讨论】:

    • 谢谢,但我不得不改成food_expenses.sum("value * amount")
    【解决方案2】:

    您要做的是在Travel 的实例/对象 上创建一个方法。

    所以在@travel.sum_food_expensessum_food_expenses 是一个实例方法,可以这样写

    def sum_food_expenses
      food_expenses.map { |e| e.value * e.amount }.sum
    end
    

    而如果您想使用 类方法 做类似的事情,那么请使用 self.your_method

    这使电话看起来像Travel.your_method

    【讨论】:

      猜你喜欢
      • 2021-06-21
      • 2021-11-08
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      相关资源
      最近更新 更多