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

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

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

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

Q&A

解決済

2回答

613閲覧

[Rails]ユーザ毎のタスクの日別予定合計値と実績合計値を出力する

yoshi11

総合スコア2

Ruby on Rails

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

0グッド

0クリップ

投稿2020/06/16 23:47

実現したいこと

Railsで予定と実績と管理するシステムを作っています
ユーザ毎のタスクの日別予定合計値と実績合計値を出力するところで詰まっており、投稿しました。
最終的には、Chart.jsで2軸の棒グラフを出力予定です。

前提

User --* Task
Userに複数のタスクが紐付いています

task table

create_table "tasks", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "name" t.bigint "user_id" t.bigint "category_id" t.float "estimated_time" t.float "actual_time" t.datetime "start_time" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["category_id"], name: "index_tasks_on_category_id" t.index ["user_id"], name: "index_tasks_on_user_id" end

start_timeはdatetimeとなっており、タスクの実施日としています。こちらをキーに日別の合計値を出したいと思っております。

task table 例

Task IdNameUser IdCategory NameEstimated imeActual_timeStart time
1hoge11work232020/05/17
2hoge21mtg232020/05/11
3hoge31mtg232020/05/11
:::::::

実現したい例

Start timeEstimated ime の SUMActual_time の SUM
2020/05/1146
2020/05/1723
2020/05/2123
2020/06/06::

現状

@estimated_time = Task.where(user: 1).group("DATE(start_time)").sum(:estimated_time) 出力結果 {Sun, 10 May 2020=>2.0, Sat, 16 May 2020=>2.0, Wed, 20 May 2020=>2.0, Fri, 05 Jun 2020=>3.0, Mon, 08 Jun 2020=>1.0, Mon, 29 Jun 2020=>1.0}

上記のコードで一つのカラムの合計値は取れるのですが、実現したい、予定と実績の2つの合計値を別々に出力し、インスタンス変数に格納できていないです。

arelを活用、SQLをRailsに組み込むなど?実現方法がわからない状態となっております。

補足情報(FW/ツールのバージョンなど)

Rails 5.2.4.1
Ruby 2.4.3
mysql 5.7

ご意見や参考になる記事等をご教示いただけると嬉しいです。

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

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

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

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

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

guest

回答2

0

自己解決

ruby

1con = ActiveRecord::Base.connection 2sql = "SELECT 3 DATE_FORMAT(start_time, '%Y-%m-%d') as start_time, SUM(estimated_time), SUM(actual_time) 4 FROM 5 tasks 6 WHERE user_id = #{@user} 7 GROUP BY DATE_FORMAT(start_time, '%Y-%m-%d')" 8 @result = con.select_all(sql) 9[{"start_time"=>"2020-05-10", "SUM(estimated_time)"=>2.0, "SUM(actual_time)"=>3.0}, {"start_time"=>"2020-05-20", "SUM(estimated_time)"=>2.0, "SUM(actual_time)"=>3.0}, {"start_time"=>"2020-06-08", "SUM(estimated_time)"=>1.0, "SUM(actual_time)"=>1.0}] 10

こちらの記事を参考にしながら、日別予定合計値と実績合計値を出力出来ました

参考
ActiveRecordで生SQLを使いたいときに便利なメソッド達

投稿2020/06/21 01:16

yoshi11

総合スコア2

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

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

0

ruby

1@user = current_user.id 2con = ActiveRecord::Base.connection 3sql = "SELECT 4 DATE_FORMAT(start_time, '%Y-%m-%d') as start_time, SUM(estimated_time), SUM(actual_time) 5 FROM 6 tasks 7 WHERE user_id = #{@user} 8 GROUP BY DATE_FORMAT(start_time, '%Y-%m-%d')" 9@result = con.select_all(sql) 10 11# output 12[{"start_time"=>"2020-05-10", "SUM(estimated_time)"=>2.0, "SUM(actual_time)"=>3.0}, {"start_time"=>"2020-05-20", "SUM(estimated_time)"=>2.0, "SUM(actual_time)"=>3.0}, {"start_time"=>"2020-06-08", "SUM(estimated_time)"=>1.0, "SUM(actual_time)"=>1.0} 13 14# Chart.jsで表示するため、viewsで配列に変更 15<% a = [] %> 16<% b = [] %> 17<% c = [] %> 18<% @result.each do |f| %> 19 <% a.push f['start_time'] %> 20 <% b.push f['SUM(estimated_time)'] %> 21 <% c.push f['SUM(actual_time)'] %> 22<% end %> 23 24# output 25a 26["2020-05-10","2020-05-16","2020-05-20","2020-06-05","2020-06-08","2020-06-29"] 27b 28[2.0, 2.0, 2.0, 3.0, 1.0, 1.0] 29c 30[3.0, 3.0, 3.0, 3.0, 1.0, 1.0] 31 32

こちらの記事を参考にしながら、日別予定合計値と実績合計値を出力出来ました

参考
ActiveRecordで生SQLを使いたいときに便利なメソッド達

投稿2020/06/20 22:36

編集2020/06/21 01:16
yoshi11

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問