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

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

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

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

Ruby on Rails 6

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

Q&A

解決済

2回答

1405閲覧

rails ユーザーごとの合計値算出

hurousyotoku500

総合スコア27

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/09/06 03:34

現在、ゴルフスコア管理アプリをrailsにて制作中なのですが、データベースとのやりとりについて、わからなくってきましたので、質問させて下さい。
まずやりたいこととしては、各ユーザーのトータルスコアを算出し、そのスコアとユーザ名をスコア順に並べて表示させるものです。
Scoreというテーブルに複数ユーザのスコアが入力されており、トータルを算出するも全てのユーザのスコアが合計されてしまいます。

ちなみにScoreテーブルには、
hole_score(そのホールのスコア)
par(そのホールのPar)
user_id
hole(ホール)
のカラムがあります。

controller

@total_score =Score.all.sum(:hole_score)

view

<%= @total_score %>

で、テーブル全体の合計は出せたのですが、ユーザごとにという方法がわからず困っております。
また、もうひとつよくわからない点として、カラムを指定するのは、controller側なのか、view側なのか、
どちらが望ましいのでしょうか。
たとえば、

@scores = Score.all (controller)
<%= @scores.sum(:hole_score) %> (view)
と、
@total_score =Score.all.sum(:hole_score) (controller)
<%= @total_score %> (view)
は結果同じになると思いますが、どちらが良いのでしょうか。

ヒントやアドバイスを宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ユーザごと
score だけで良いのでしたら
scores = Score.group(:user_id).select("user_id,sum(score) as sum_score")
とすると

scores[?].user_id
scores[?].sum_score
で結果が得られます

カラムを指定するのは、controller側なのか、view側なのか
場合によりますが、できるだけ controllerにするのがよいと思います。
場合ですが、
@score から取るのが total_score だけなら controllerが良いですが、
その他にも色々取るのだ、となると viewのほうが良いです。

「できるだけ」というのは、viewってごちゃごちゃになりやすいので、できるだけ計算は済ませておいてすっきり書きたいです

投稿2020/09/06 06:03

winterboum

総合スコア23329

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

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

hurousyotoku500

2020/09/06 11:26

ご回答ありがとうございます。 すみません、色々やってみたのですが、いまいち使い方がわからず… scores[?].user_idの[?]はどういった値がはいるのでしょうか。 また、scores[?].user_idのは全てのユーザーを表示させるにはeach.doを使うのでしょうか?
winterboum

2020/09/06 11:37

配列の0,1,2,3とかです。 scores.each で全部を。 sum(score) ここ sum(hole_score) ですね
hurousyotoku500

2020/09/06 13:04

<% @sum_score.each do |score| %> <p><%= score.user_id %></p> <p><%= score.sum_score %></p> <% end %> このコードでuser_idとsum_scoreは表示されるようになりましたが、コード的には問題ないでしょうか。いまいちこれであっているのか自信がもてなくて…
guest

0

ユーザごとにという方法がわからず困っております。

ユーザーごとに合計を出すのであれば下記の様にgroup byを使う感じになると思います。

例えば

ruby

1Score.all.group(:user_id).sum(:hole_score)

みたいにすればユーザーごとのhole_scoreの合計が取れると思います。

カラムを指定するのは、controller側なのか、view側なのか、

どちらが望ましいのでしょうか。

ユーザーそれぞれの合計スコアを表示するのであれば 自分の場合は

controllerに

ruby

1@user_total_scores = Score.all.group(:user_id).sum(:hole_score)

みたいに書いて

viewに

erb

1@user_total_scores.each do |user_total_score| 2// 表示したいものを書く 3end

みたいな感じにすると思います。

投稿2020/09/06 05:54

SibakenY

総合スコア63

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

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

hurousyotoku500

2020/09/06 08:45

ご返答ありがとうございます。 コントローラーを、 @user_total_scores = Score.all.group(:user_id).sum(:hole_score) とし、 ERBを <%= @user_total_scores.each do |user_total_score| %> <p> <%= @user_total_scores %> </p> <% end %> として、 {1=>82, 2=>108} {1=>82, 2=>108} {1=>82, 2=>108} のように表示されました。 userは全部で3個あるので、3回表示されているのだと思いますが、 なぜ、ハッシュ?で表示されてしますのでしょうか。
winterboum

2020/09/06 11:40

Score.all.group(:user_id).sum(:hole_score) という書き方の場合は { user_id => 合計, user_id => 合計 } という結果が返るのが仕様です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問