干掉这些辅助方法

时间:2013-04-20 04:32:06

标签: ruby ruby-on-rails-3 ruby-on-rails-3.2

我有三种方法:

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 个答案:

答案 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,因为它将是最后评估的表达式。