2013-04-20 2 views
0

이 헬퍼 방법 : 지방, 탄수화물, 단백질에 대한건조까지 내가 세 가지 방법이 같이있어

def total_fat 
    total = 0 
    meal_foods = current_user.meal_foods 
    meal_foods.each do |food| 
    total += food.fat 
    end 
    return total 
end 

하나.

DRY하고 싶습니다.

나는이 방법을 시도했지만 문자열로 '매크로'를 전달하여 작동하지 않는 것 같습니다.

def total_of(macro) 
    total = 0 
    meal_foods = current_user.meal_foods 
    meal_foods.each do |food| 
    total += food.macro 
    end 
    return total 
end 

어떻게하면됩니까?

답변

3
def total_of(marcro) 
    current_user.meal_foods.map(&marcro).inject(:+) 
end 

이것은 meal_foods들의 어레이 (-like) 컬렉션을 취하고 meal_foods 단지 marcro 값의 배열에 매핑하고 각 숫자 사이에 "+"를 주입한다. 인수를 기호로 전달해야합니다 (예 : total_of(:fat).

0

send를 사용하여 변수가있는 메소드를 호출하고 매크로를 기호로 변환해야합니다.

그렇게 :

food.send(macro.to_sym) 
0
def total_of(macro) 
    current_user.meal_foods.inject(0) do |total,food| 
    total + food.send(macro) 
    end 
end 

나는 당신이 그것을 시도 할 데이터를 제공하지했듯이이 작동합니다 확실하지 않다,하지만 당신에게 무엇을 몇 가지 아이디어를 제공하기 the Enumerable 문서를 보라 할 수 있습니다. each_with_object은 아직 사용되지 않으며 여기에도 적합합니다.

명시 적으로 반환 할 필요가 없습니다. 실제로 total을 언급 할 필요가 없습니다. 마지막 표현식이 될 것이기 때문입니다.

1
def total_of(type) 
    current_user.meal_foods.map(&:type).sum 
end 

total_of (: 지방)

+0

'배열 #의 sum'은 ActiveSupport가 필요합니다. 질문에는 Rails 태그가 있지만 질문 자체는 순수한 루비 태그 일 수 있습니다. –

+0

설명해 주셔서 감사합니다. – Fon