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  

我怎么能这样做?

4

4 回答 4

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

这需要 Array(-like) 集合meal_foods并将其映射到仅包含 的marcro值的Array meal_foods,然后在每个数字之间注入“+”。确保将参数作为符号传递,例如total_of(:fat).

于 2013-04-20T04:42:58.863 回答
1
def total_of(type)
  current_user.meal_foods.map(&:type).sum
end

total_of(:fat)

于 2013-04-20T09:04:30.947 回答
0

您需要使用 send 来调用带有变量的方法,并将宏转换为符号。

所以:

  food.send(macro.to_sym)
于 2013-04-20T04:39:47.300 回答
0
def total_of(macro)
  current_user.meal_foods.inject(0) do |total,food|
    total + food.send(macro)
  end
end

我不确定这是否会奏效,因为您没有提供任何数据来尝试它,但请查看Enumerable文档,让您了解可以做什么。each_with_object未被充分利用,也适合这里。

不需要显式返回。事实上,甚至不需要提及total,因为它将是最后一个评估的表达式。

于 2013-04-20T04:40:00.987 回答