##はじめに
オリジナルアプリ制作過程で評価機能を作ったので健忘録として残します
##1.DBファイル
class CreateEvaluates < ActiveRecord::Migration[6.0]
def change
create_table :evaluates do |t|
t.integer :speedy
t.integer :kindness
t.integer :frantically
t.references :user, foreign_key: true
t.timestamps
end
end
end
今回は早さ、親切さ、リピート、総合力の評価をしたかったので3つのカラムを用意しました。
でも総合力無いじゃんと思いましよね?わざわざ作らんでも四則演算できると思ってBDにはカラムとして用意はしませんでした
##2.controller
def show
@evaluate = Evaluate.new
@evaluates = Evaluate.includes(:user)
@kindness = Evaluate.average(:kindness)
@speedy = Evaluate.average(:speedy)
@frantically = Evaluate.average(:frantically)
@comprehensive = @kindness + @speedy + @frantically
@posts = Post.includes(:user).order("created_at DESC")
end
注目していただきたいのは@kindness以降
average(:kindness)で、カラムkindnessの平均を割り出し、インスタンス変数に代入します
それを3つのカラム分行います
@comprehensiveは総合力として、平均を割り出し、代入したインスタンス変数を足しただけです
先ほども伝えた通り、DBで総合力は必要なかったと言う事です
※追記
上記の総合力を求めるコードのみだと、DBに何も登録されていない場合エラーが起きてしまいます
なのでIF文を利用して、各カラムに値がが入っていない場合に計算を行わないコードを記載します
↓
if @kindness != nil && @speedy != nil && @frantically != nil
@comprehensive = @kindness + @frantically + @speedy
end
!=は==の逆で、〜ではないと言う意味となるので今回のコードは各カラムに空の値出ない場合に合計値を求めるようにすると言う内容になってます
##3.viws
.UserStatus
他のユーザーの評価(平均点)
.UserStatus__Kindness
= "親切度 : #{@kindness}"
.UserStatus__speedy
= "迅速さ : #{@speedy}"
.UserStatus__frantically
= "repeat : #{@frantically}"
.UserStatus__comprehensive
= "総合力 : #{@comprehensive}"
ビューにインスタンス変数を記述してあげればブラウザ上で表示されます