0

私はこのような3つの方法を持っています:

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

脂肪、炭水化物、タンパク質の 1 つ。

これを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  

どうすればこれを行うことができますか?

4

4 に答える 4

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

これは の Array(-like) コレクションを取り、それを の値meal_foodsだけの Array にマップし、各数値の間に「+」を挿入します。引数をシンボルとして渡すようにしてください。marcromeal_foodstotal_of(:fat)

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

total_of(:脂肪)

于 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 docs を見て、何ができるかについてのアイデアを提供してください。each_with_objectあまり使用されておらず、ここにも収まります。

明示的なリターンは必要ありません。total実際、評価される最後の式になるため、言及する必要さえありません。

于 2013-04-20T04:40:00.987 に答える