簡體   English   中英

Rails邏輯最佳實踐

[英]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 TravelsControllerundefined 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 }.sumO(2n) ,但可以寫為food_expenses.sum { |e| e.value * e.amount } food_expenses.sum { |e| e.value * e.amount } ,只有O(n)

你要做的是在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM