これにはいくつかの方法があります。たとえば、このロジックをカスタム ヘルパーに抽象化できる可能性があります。私がとるアプローチは、このロジックをモデルに組み込み、User
モデル自体に便利なメソッドを作成することです。
# app/models/user.rb
class User < ActiveRecord::Base
has_many :ratings
def average_rating
ratings_array = ratings.map(&:rating)
ratings_array.inject{ |sum, el| sum + el }.to_f
end
end
次に、ビューの場合、次のように評価にアクセスします。
<%= @user.ratings %>
アップデート:
ビュー ヘルパーを使用する傾向がある場合は、次のようなものが機能します。
# app/helpers/ratings_helper.rb
module RatingsHelper
def average_rating(ratings)
ratings_array = ratings.map(&:rating)
ratings_array.inject{|sum, el| sum + el}.to_f
end
end
ビューでは、評価を渡して次の平均を計算することで、平均にアクセスします。
<%= average_rating(@user.ratings) %>
更新 2:
うわー。1 行のコードでaverage()
特定の列の平均値を計算する、ネイティブの ActiveRecord 関数が呼び出されます。
<%= @user.ratings.average('rating') %>
この機能はデータベースレベルで動作すると思います。その場合、この方法を使用すると、ほぼ確実に、リストされているソリューションの中で最も低いオーバーヘッドが生成されます。