2013-04-20 71 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 

一爲脂肪,碳水化合物和蛋白質。

我想幹這件事。

我試過這種方法,它似乎並沒有通過傳遞'宏'作爲字符串工作。

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陣列(樣)的收集和將其映射到正好meal_foodsmarcro值的陣列,然後注入一個「+」每個號碼之間。確保將參數作爲符號傳遞,例如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標籤,但問題本身可能是純Ruby的。 – 2013-04-20 09:34:04

+0

謝謝你的澄清 – Fon 2013-04-20 11:23:55