質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

210閲覧

DBからハッシュ化したデータを集計したい

shuzi

総合スコア197

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/05/31 05:49

ダイエット記録をとろうとおもっているのですがハッシュしたデータをひとつに纏めたいのですがどうすればよいのでしょうか?group_byを使って項目をmeal_timeごとにしてその後にeachを回そうと思ってもその後の処理がうまくかけません。.sumメソッドとか、.mapメソッドとか、inclideメソッドとか使おうとしましたが出来ず。。
よろしくお願いします。

ruby

1@foods_cal.group_by{|d| d[:meal_time]}.each do |hasy, key| 2 key.each do |key2| 3 処理式が書けず、足踏み中。 4 end 5end

理想

ruby

1@foods_cal = [ 2{ 3:meal_time=>"仕事中", :meal_contents=>"とり五目おにぎり", :meal_cal=>250, :meal_amount=>2 4}, 5:meal_time=>"仕事中", :meal_contents=>"サ ンドイッチ", :meal_cal=>300, :meal_amount=>1 6} 7{:meal_time=>"昼食", :meal_contents=>"ハンバーガー", :meal_cal=>500, :meal_amount=>2 8}, 9{ 10:meal_time=>"朝食", :meal_contents=>"サンドイッチ", :meal_cal=>300, :meal_amount=>1 11}

現状

ruby

1@foods_cal = [ 2{ 3:meal_time=>"仕事中", :meal_contents=>"とり五目おにぎり", :meal_cal=>250, :meal_amount=>1 4}, 5{ 6:meal_time=>"仕事中", :meal_contents=>"とり五目おにぎり", :meal_cal=>250, :meal_amount=>1 7}, 8{ 9:meal_time=>"仕事中", :meal_contents=>"サ ンドイッチ", :meal_cal=>300, :meal_amount=>1 10} 11{:meal_time=>"仕事中", :meal_contents=>"ハンバーガー", :meal_cal=>500, :meal_amount=>1 12}, 13{ 14:meal_time=>"昼食", :meal_contents=>"ハンバーガー", :meal_cal=>500, :meal_amount=>1 15}, 16{ 17:meal_time=>"朝食", :meal_contents=>"サンドイッチ", :meal_cal=>300, :meal_amount=>1 18}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

ruby

1@content_cal = @foods_cal.group_by{|a| 2 a[:meal_time]}.map{|b,c| 3 [b,c.group_by{|d| 4 d[:meal_contents]}.map{|e,f| 5 [e,[f.sum{|h|h[:meal_cal]}/f.length,f.sum{|g|g[:meal_amount]}]] 6 }] 7 }.to_h
{  "仕事中"=>[   ["とり五目おにぎり", [0.238e3, 0.5e1]],   ["サンドイッチ", [0.333e3, 0.1e1]],   ["ハンバーガー", [0.5e3, 0.1e1]],   ["舞茸おこわおにぎり", [0.205e3, 0.1e1]]],  "昼食"=>[   ["コーラ", [0.3e3, 0.1e1]],   ["ハンバーガー", [0.5e3, 0.2e1]],   ["ポテト", [0.16e3, 0.1e1]]],  "朝食"=>[   ["ウナギ", [0.433e3, 0.1e1]],   ["サンドイッチ", [0.333e3, 0.2e1]]]}

でだいぶ簡素化出来ました。
これ以上は頭がパンクしそうなのでコネコネしない予定です。

投稿2019/06/02 09:42

編集2019/06/02 09:45
shuzi

総合スコア197

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

グループでまとめて、分解し、格納しなおすことで対応しました。

ruby

1@foods_cal.group_by{|d| d[:meal_time]}.each do | times, foods | 2 @content_cal[times] = {} 3 foods.group_by{|d| d[:meal_contents]}.each do | time, food | 4 @content_cal[times][time] = {} 5 food.each do |fod | 6 @content_cal[times][time][:cal_sum] = @content_cal[times][time][:cal_sum].to_f + fod[:meal_cal] * fod[:meal_amount] 7 @content_cal[times][time][:meal_amount] = @content_cal[times][time][:meal_amount].to_f + fod[:meal_amount] 8 @content_cal[times][time][:meal_cal] = fod[:meal_cal]

そして、さらに、viewでも分解、対応

view

1- @content_cal.each do | ( times , foods )| 2 - foods.each_with_index do |(content,meal), index| 3 tr 4 - if index == 0 5 - @row = foods.count 6 td rowspan = foods.count #{times} 7 - elsif index == @row 8 td rowspan = foods.count #{times} 9 td = content 10 td = t(:cal, num: meal[:meal_cal]) 11 td = meal[:meal_amount] 12 td = t(:cal, num: meal[:cal_sum]) 13 //時間帯ごとにカロリー表示。 14 - if index == 0 15 - @row = foods.count 16 td rowspan = foods.count #{t(:cal, num: "#{@time_cal[times]}")} 17 - elsif index == @row 18 - @row += foods.count 19 td rowspan = foods.count #{t(:cal, num: "#{@time_cal[times]}")}

イメージ説明

もっと簡単に出来るはずなのに。。それが分かりません。。。。

投稿2019/05/31 11:14

shuzi

総合スコア197

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問