我有三种方法:
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
我怎么能这样做?
答案 0 :(得分:3)
def total_of(marcro)
current_user.meal_foods.map(&marcro).inject(:+)
end
这将获取meal_foods
的数组(类似)集合并将其映射到仅marcro
meal_foods
的{{1}}值的数组,然后在每个数组之间注入“+”数字。确保将参数作为符号传递,例如total_of(:fat)
。
答案 1 :(得分:1)
def total_of(type)
current_user.meal_foods.map(&:type).sum
end
total_of(:脂肪)
答案 2 :(得分:0)
您需要使用send来调用带变量的方法,并将宏转换为符号。
所以:
food.send(macro.to_sym)
答案 3 :(得分: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
,因为它将是最后评估的表达式。