成績集計ツール「みんなのせいせき」の機能・仕様の解説(2017年4月版)
先日、学科でテストの成績を集計・順位付けするためのツールを作りました。
私の所属する学科(電気系)では日頃の授業の成績が卒論配属に関係するため、みんな自分の現在位置を知れると便利だろうなと思ったのが作った理由です。
(というのはあくまでも理由の半分で、残り半分は単純にどんな点数分布になっているのか興味があったからです(笑))
「みんなのせいせき」のリンクはこちら:(ベーシック認証がかけてあるため学科の人しか成績の登録・閲覧に進むことができません)
https://eeic-scores.herokuapp.com/
ソースコード (GitHub) はこちら(まだ整理が間に合っておらず汚いです):
https://github.com/elecho1/score_competing_tool
以下、今更感満載ですが「みんなのせいせき」の機能・構成を解説してみたいと思います。
機能の概要
成績一覧表
成績の総合順位ごとに評価の一覧が色つけされて表示されます。そのため、自分の立ち位置・他の人の評価の取り方を知ることができます。自分の成績の行はは水色で表示されます。
なお、成績一覧表に名前を表示するかどうか、評価を表示させるかどうかは設定することができます。また、自分の点数を登録しないと成績一覧表が見れないようになっています。(笑)
自分の成績の概要・順位
各ユーザーの個人ページでは、GPA・総合順位・各科目の順位を知ることができます。また、(現実にはいませんでしたが)自分の点数、順位をツイートすることができます(笑)
成績の分布
各科目の各評価の人数をグラフとして表示しています。このグラフを見ることで、自分の評価がどれぐらいレアなのか、この科目で不可をとった人が何人いるのか知ることができます。
作成環境
- 動作プラットフォーム :heroku
- 動作フレームワーク :Ruby on Rails
- デザインフレームワーク:bootstrap & Honoka
- ユーザー認証gem :devise
動作の概要
モデルの構成
users テーブル
ログインIDなどの基本情報、自分の成績やニックネームを成績一覧表で公開するかどうかなどを保管しています。また、user_scores テーブルのレコードと1対1で対応しています。
user_scores テーブル
このテーブルでは、ユーザーのGPAや総合得点を保管しています。このテーブルの各コラムはusers テーブルに組み込んでも動作しますが、後の拡張性のため、またデータベースだけを閲覧しても直接ユーザーの情報と点数が結び付けられないようにするために、わざわざusers テーブルとscores テーブルの間にuser_scoresテーブルを挟んでいます。
user_scores テーブルのレコードとscores テーブルの間は1対多の関係になっています。subjects テーブル
このテーブルは、科目の名前・単位数のデータを保管しています。このテーブルのレコードはシードとして初期データを入れたあとは変更されることはありません。 各科目に対していろいろな人の点数が存在するため、subjects テーブルとscores テーブルの間は1対多の関係になっています。
scores テーブル
このテーブルでは、1つのレコードにつき1つの点数を保管しています。それぞれの点数はユーザーIDという属性と科目IDという属性を持つため、scores テーブルの各レコードとuser_scores テーブル、subjects テーブルの間はそれぞれ多対1の関係になっています。
コントローラーの一覧
application_controller.rb
どのコントローラーにも共通の設定(ベーシック認証の設定など)が記述されています。
users_controller.rb
ユーザーの登録・ログインなどを司るコントローラーです。
myscores_controller.rb
各ユーザーの自分の点数の総合評価・各科目の順位を表させるためのコントローラーです。
tables_controller.rb
みんなの点数一覧表を作成するためのコントローラーです。
distribution_graphs_controller.rb
各科目の成績評価を集計し、chart.jsを用いてグラフとして表示させるコントローラーです。
static_pages_controller.rb
ホーム画面やaboutページなどの比較的静的なページを表示させるためのコントローラーです。
以上が概要になります。以降時間があったときに少しずつどのようなコードでどのような機能を実現しているのか紹介していければなと思います。
(その前にコードきれいにしなきゃ…大汗)
なにかありましたらご指摘をいただけると幸いです。
それでは。