🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails 6

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

Ruby on Rails

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

1回答

1014閲覧

railsで点数計算アプリケーションを作成したいが、データベース設計からつまづいてしまいました

teru_teru

総合スコア1

Ruby

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

Ruby on Rails 6

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

Ruby on Rails

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

1クリップ

投稿2021/03/02 14:05

前提・実現したいこと

テレビやライブ中継中に、極力手元を見ずスマートフォンで演技内容を入力・評価していく、簡単なフィギュアスケートの採点システムを作っています。

データベースを設計中に以下の課題が発生しました。

発生している問題

以下の内容を実現するためのDB設計

・極力手元を見ないで入力する為に、セレクトボタンやラジオボタンを使って演技の種類とGOE(評価)値をDBに送り、seedファイルに入力していた内容と比較してseedファイルの基礎点を引っ張って最急的な点数を出そうとしている。
・スマートフォンという画面が小さい中で入力を簡易にする為に、入力をウィザート形式(対話形式)で入力しようとしているため、テーブルをビュー画面毎に分ける必要があると考えている。
・ジャンプはコンビネーションをする場合がある
・後半になると基礎点が1.1倍になる
・最終的にすべて入力知終わったら、演技内容とGOEと総合点数をだそうと考えている。

seeds

1# ジャンプ基礎点 2 3# 1回転 4Jump_elements.create(name: "シングルトウループ", symbol: "1T", basic_score: 0.40) 5Jump_elements.create(name: "シングルサルコウ", symbol: "1S", basic_score: 0.40) 6Jump_elements.create(name: "シングルループ", symbol: "1Lo", basic_score: 0.50) 7Jump_elements.create(name: "シングルオイラー", symbol: "1Eu", basic_score: 0.50) 8Jump_elements.create(name: "シングルフリップ", symbol: "1F", basic_score: 0.50) 9Jump_elements.create(name: "シングルルッツ", symbol: "1Lz", basic_score: 0.60) 10# 2回転 11Jump_elements.create(name: "シングルアクセル", symbol: "1A", basic_score: 1.10) 12Jump_elements.create(name: "ダブルトウループ", symbol: "2T", basic_score: 1.30) 13Jump_elements.create(name: "ダブルサルコウ", symbol: "2S", basic_score: 1.30) 14Jump_elements.create(name: "ダブルループ", symbol: "2Lo", basic_score: 1.70) 15Jump_elements.create(name: "ダブルフリップ", symbol: "2F", basic_score: 1.80) 16Jump_elements.create(name: "ダブルルッツ", symbol: "2Lz", basic_score: 2.10) 17# 3回転 18Jump_elements.create(name: "ダブルアクセル", symbol: "2A", basic_score: 3.30) 19Jump_elements.create(name: "トリプルトウループ", symbol: "3T", basic_score: 4.20) 20Jump_elements.create(name: "トリプルサルコウ", symbol: "3S", basic_score: 4.30) 21Jump_elements.create(name: "トリプルループ", symbol: "3Lo", basic_score: 4.90) 22Jump_elements.create(name: "トリプルフリップ", symbol: "3F", basic_score: 5.30) 23Jump_elements.create(name: "トリプルルッツ", symbol: "3Lz", basic_score: 5.90) 24# 4回転 25Jump_elements.create(name: "トリプルアクセル", symbol: "3A", basic_score: 8.00) 26Jump_elements.create(name: "クワドトウループ", symbol: "4T", basic_score: 9.50) 27Jump_elements.create(name: "クワドサルコウ", symbol: "4S", basic_score: 9.70) 28Jump_elements.create(name: "クワドループ", symbol: "4Lo", basic_score: 10.50) 29Jump_elements.create(name: "クワドフリップ", symbol: "4F", basic_score: 11.50) 30Jump_elements.create(name: "クワドルッツ", symbol: "4Lz", basic_score: 12.50) 31 32 33# スピン基礎点 34 35# 単一姿勢・足変え無し 36# アップライトスピン 37Spin_elements.create(name: "アップライトスピンLv.B", symbol: "USpB", basic_score: 1.00) 38Spin_elements.create(name: "アップライトスピンLv.1", symbol: "USp1", basic_score: 1.20) 39Spin_elements.create(name: "アップライトスピンLv.2", symbol: "USp2", basic_score: 1.50) 40Spin_elements.create(name: "アップライトスピンLv.3", symbol: "USp3", basic_score: 1.90) 41Spin_elements.create(name: "アップライトスピンLv.4", symbol: "USp4", basic_score: 2.40) 42 43 44# レイバックスピン 45Spin_elements.create(name: "レイバックスピンLv.B", symbol: "LSpB", basic_score: 1.20) 46Spin_elements.create(name: "レイバックスピンLv.1", symbol: "LSp1", basic_score: 1.50) 47Spin_elements.create(name: "レイバックスピンLv.2", symbol: "LSp2", basic_score: 1.90) 48Spin_elements.create(name: "レイバックスピンLv.3", symbol: "LSp3", basic_score: 2.40) 49Spin_elements.create(name: "レイバックスピンLv.4", symbol: "LSp4", basic_score: 2.70) 50 51# キャメルスピン 52Spin_elements.create(name: "キャメルスピンLv.B", symbol: "CSpB", basic_score: 1.10) 53Spin_elements.create(name: "キャメルスピンLv.1", symbol: "CSp1", basic_score: 1.40) 54Spin_elements.create(name: "キャメルスピンLv.2", symbol: "CSp2", basic_score: 1.80) 55Spin_elements.create(name: "キャメルスピンLv.3", symbol: "CSp3", basic_score: 2.30) 56Spin_elements.create(name: "キャメルスピンLv.4", symbol: "CSp4", basic_score: 2.60) 57 58# シットスピン 59Spin_elements.create(name: "シットスピンLv.B", symbol: "SSpB", basic_score: 1.10) 60Spin_elements.create(name: "シットスピンLv.1", symbol: "SSp1", basic_score: 1.30) 61Spin_elements.create(name: "シットスピンLv.2", symbol: "SSp2", basic_score: 1.60) 62Spin_elements.create(name: "シットスピンLv.3", symbol: "SSp3", basic_score: 2.10) 63Spin_elements.create(name: "シットスピンLv.4", symbol: "SSp4", basic_score: 2.50) 64 65以下も同じようにレベル!〜4毎に入力していますが、文字数関係で省略しました。 66 67# フライングスピン 68# アップライトスピン 69 70# レイバックスピン 71 72# キャメルスピン 73 74# シットスピン 75 76 77# 単一姿勢・足変え有り 78# 足換えアップライトスピン 79 80# 足換えレイバックスピン 81 82# 足換えキャメルスピン 83 84# 足換えシットスピン 85 86 87# フライング・足変え有り 88# (フライング)足換えアップライトスピン 89 90# (フライング)足換えレイバックスピン 91 92# (フライング)足換えキャメルスピン 93 94# (フライング)足換えシットスピン 95 96 97 98# 足変え無し 99# コンビネーションスピン 100 101 102# 足変えあり 103# 足換えコンビネーションスピン 104 105 106# 足変え無し 107# フライングコンビネーションスピン 108 109# 足変えあり 110# フライング足換えコンビネーションスピン 111

該当のソースコード

ruby

1# テーブル設計 2 3## usersテーブル 4 5| Column | Type | Options | 6| ---------- | ------ | ------------------------- | 7| nickname | string | null: false | 8| email | string | null: false, unique: true | 9| encrypted_password | string | null: false | 10 11## Association 12- has_many :posts 13 14 15## postテーブル 16 17| Column | Type | Options | 18| ------------------- | ---------- | -------------------------------- | 19| athletes | string | foreign_key: true | 20| elements1 | references | foreign_key: true | 21| elements2 | references | foreign_key: true | 22| elements3 | references | foreign_key: true | 23| elements4 | references | foreign_key: true | 24| elements5 | references | foreign_key: true | 25| elements6 | references | foreign_key: true | 26| elements7 | references | foreign_key: true | 27| elements8 | references | foreign_key: true | 28| elements9 | references | foreign_key: true | 29| elements10 | references | foreign_key: true | 30| elements11 | references | foreign_key: true | 31| elements12 | references | foreign_key: true | 32| user | references | null: false, foreign_key: true | 33 34 35## Association 36 37- belongs_to :user 38 39## Athletesテーブル 40 41| Column | Type | Options | 42| ---------- | ------ | ------------------------- | 43| name | string | null: false | 44 45 46## Association 47- belongs_to :user 48- has_many :elements1 49- has_many :elements2 50- has_many :elements3 51- has_many :elements4 52- has_many :elements5 53- has_many :elements6 54- has_many :elements7 55- has_many :elements8 56- has_many :elements9 57- has_many :elements10 58- has_many :elements11 59- has_many :elements12 60 61## Elements1〜12 テーブル 62 63| Column | Type | Options | 64| ------------------- | ---------- | -------------------------------- | 65| text | string | | 66| symbol | string | | 67| goe | string | | 68| multiplication | string | | 69| basic_score | string | | 70| athlete_id | string | | 71 72 73## Association 74 75- belongs_to :athlet

試したこと

上記のように作成しましたが、テーブルを多く作成してしまうので、反応が遅くなるのではないかと考えました。もっとより効率良い方法があれば聞きたいです。

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

rails 6
macOS Catalina バージョン10.15.7

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

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

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

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

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

guest

回答1

0

ベストアンサー

goeやmultiplicationという用語が分かりませんが、私なら以下のようにします。

用意するテーブルは
・users
・elements
・athletes
・scores

elements テーブルには jump や spinといった値を格納するカラムを作ります。
elements や athletes は基本的に更新しません。

scores テーブルに、採点者(user)が競技者(athlete)のエレメンツ?(element)を
どう採点したか(goe? multiplication?)を記録していきます。

モデル

ruby

1class Score 2 belongs_to :element 3 belongs_to :user 4 belongs_to :athlete 5 6class Element 7 has_many :scores 8 9class Athlete 10 has_many :scores 11 12class User 13 has_many :scores

スコアを記録するコントローラー

ruby

1# POST /scores 2def create 3 Score.create(score_params) 4end 5 6private 7 8def score_params 9 # element_id, athlete_id, goe, multiplication はクライアントから送信させる 10 # user はログインしているユーザー 11 params.require(:score).permit(:element_id, :athlete_id, :goe, :multiplication).merge(user: current_user) 12end

記録したscoreは以下のようにして集計できるはずです。

ruby

1@athlete = Athlete.find(1) 2 3# goe の一覧 4@goe = @athlete.scores.pluck(:goe) 5 6# goe の合計 7@goe_sum = @athlete.scores.sum(:goe) 8 9# goe に score をかけてみる 10@goe_by_multiplication = @athlete.scores.map do |score| 11 score.goe * score.multiplication 12end 13 14# ジャンプのgoeの合計 15# 「jumpやspinといった値を格納する」カラム名はelement_typeという名前にしました 16@goe_jump = @athlete.scores.joins(:elements) 17 .where("elements.element_type = ?", "jump").sum(:goe)

投稿2021/03/02 21:41

neko_daisuki

総合スコア2090

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

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

teru_teru

2021/03/04 06:14

ありがとうございます。 参考になります! 少し気になった点があるのですが、 athletes は基本的に更新しないという事でしたが、選手名を入力してscoreを入力していくので、Formオブジェクトを使用し別々のテーブルへ入力する必要があると思っていたのですが、scoreテーブル内にAthletesカラムのidを記入する事でアソシエーションによって入力せずとも大丈夫という事でしょうか?
neko_daisuki

2021/03/04 07:27

「アソシエーションによって入力せずとも大丈夫」の意味がちょっと分かりません。 選手は用意したものの中から選択する形だと思い込んでいましたが、 選手をユーザーに入力させる(新規に作成する)場合でも同じ設計にします。 1. ユーザーに選手を選択させる。または作成させる。 2. 1で選択(作成)した選手(のID)をクライアントに記録させる。 3. スコアを入力させる 4. 2の選手とスコアを紐付けて保存する なので、選手の選択(入力)は必要です。
teru_teru

2021/03/05 05:29

書き方が明確でなくてすみません!「アソシエーションによって入力せずとも大丈夫」とは、中間テーブルのようなものかと考えましたが、お答えを聞いた限り違うようですね。 選手は用意したものではなく、新規に作成する形です。 選手の入力は必要と分かりました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問