2014-09-22 10 views
1

У меня были некоторые расчеты на мой контроллер, как этотRails логики передовой практики

@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

В модели путешествия def self.sum_food_expenses определен метод класса, а не метод экземпляра. Вы хотите def sum_food_expenses. Затем в контроллере вы можете позвонить @travel.sum_food_expenses.

EDIT: Кроме того, чтобы не быть приверженцем, но self.food_expenses.map { |e| e.value * e.amount }.sum является O(2n), но может быть записана в виде food_expenses.sum { |e| e.value * e.amount }, который был бы только O(n).

+0

Спасибо, человек, но мне пришлось перейти на 'food_expenses.sum (" value * amount ")' –

1

Что вы пытаетесь сделать, это создать метод на экземпляр/объект путешествия.

так в @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

 Смежные вопросы

  • Нет связанных вопросов^_^