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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

Ruby on Rails

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

Q&A

解決済

1回答

820閲覧

【Rails】複数あるレコードを日付毎に足して反映させたい

yastinbieber

総合スコア49

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/07/30 03:30

編集2020/07/30 04:18

前提・実現したいこと

複数あるレコードを日付毎にsumして反映させたい

詳細

現在食べた食品毎に栄養価を登録する機能を実装しているのですが、
日付単位で1日あたりにとったカロリーを集計して反映させたいと考えております。

現状だと下記の画像のように食べたカロリーをそのまま繰り返し反映するようになっているのですが、
これを日付単位で合計させ反映をさせたいと考えています。

https://gyazo.com/2704706af43254bdb139e3fd00fed512

該当のソースコード

##fooddiaries_controller class FooddiariesController < ApplicationController #一部省略 def index @fooddiaries_period = current_user.fooddiaries.where(created_at: (current_user.idealweight.start_day)..(current_user.idealweight.last_day)) end end #idealweight.start_day :記録を始めた日 #idealweight.last_dat :記録を終える日

繰り返し反映させたいのでeach文を使っています

##index.html.erb <% @fooddiaries_period.each do |fooddiary| %> <tbody> <tr> <th class="left"><%= fooddiary.kcal %></th> <th class="left"><%= fooddiary.created_at %></th> </tr> </tbody> <% end %>

試したこと

上記のコードで反映をさせると期間内に入力した食品のカロリー情報全てが反映してしまいます。

https://gyazo.com/2704706af43254bdb139e3fd00fed512

###試したコード

group化も試してみましたが日付毎に1行ずつになっただけで特に足されることはありませんでした。

@fooddiaries_period = current_user.fooddiaries.where(created_at: (current_user.idealweight.start_day)..(current_user.idealweight.last_day)).group("date(created_at)")

カロリーsumで計算をしたいので下記のようにも書いてみましたがこちらもうまくいきませんでした。

@fooddiaries_period = current_user.fooddiaries.where(created_at: (current_user.idealweight.start_day)..(current_user.idealweight.last_day)).sum { |fooddiary| fooddiary[:kcal] }

なにかいい方法がありましたらご教授いただければと思います。
よろしくお願い致します。

##追記

Fooddiaryの構造

create_table "fooddiaries", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.integer "fooddate_id" t.integer "user_id" t.integer "idealweight_id" t.integer "gram" t.integer "kcal" t.integer "protein" t.integer "fat" t.integer "carbo" t.string "timing" t.date "date" t.datetime "created_at", null: false t.datetime "updated_at", null: false end

###どの項目でまとめたいのか
日付単位で「kcal」の合計値をまとめたいです。

newアクションにて食品毎にkcalが登録されていくので、それらを日付毎にまとめ合計値をindexに反映させたいです。
現状では合計値ではなくそれぞれ登録されたものが反映されております。

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

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

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

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

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

winterboum

2020/07/30 03:41

Fooddiary の構造と、そのどの項目でまとめたいのか を載せてください
yastinbieber

2020/07/30 04:17

追記しました。 何卒宜しくお願いします。
guest

回答1

0

ベストアンサー

氏名などの他に「指定した期間」の「日々のカロリー」が表示される
そのためのデータを用意する。
と捉えます。
userに、user.calory_of_days => { 日付 => cal} が入っている感じ。
SQLで一度に採る方法もありますが、そういう神業は私はできないので、rubyにやらせます。
def calory_of_days(day_range) # start_day .. end_day で戻りがHash
日を決めるのに created_atが良いのか疑問ですが(後でまとめてつける人がいたり)とりあえずそれで
fooddiaries.where(created_at: day_range). # 期間のfooddiaryを集め group_by{|fooddiary| foddiary.created_at.to_date}. # 日付でグループ分けし map{|date,ary_fooddiary| # 日毎にカロリーを合計する [date,ary_fooddiary.inject(0){|cal,fooddiary| cal + fooddiary.kcal}] }.to_h # を、Hashに
で行けるかと。

投稿2020/07/30 07:46

winterboum

総合スコア23329

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

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

yastinbieber

2020/07/31 06:27

希望した実装ができました。 いつもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問