0

ユーザーが数値をデータベースに挿入できるようにしており、各ループを介してそれらを出力できます。しかし、平均値を出力する方法はありますか? たとえば、ユーザーがこの人物をレビューしている場合 (1 ~ 5 個の値のみ)、代わりに平均値のみを出力したいと思います。

<% @ratings.each do |r| %>
  <%= r.rating %>
<% end %>

これにより、すべてのレコードが表示されます。平均のみを表示するにはどうすればよいですか (これには、このユーザーが持っているレビューの合計も必要です)。

ありがとう!

4

2 に答える 2

1

これにはいくつかの方法があります。たとえば、このロジックをカスタム ヘルパーに抽象化できる可能性があります。私がとるアプローチは、このロジックをモデルに組み込み、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') %>

この機能はデータベースレベルで動作すると思います。その場合、この方法を使用すると、ほぼ確実に、リストされているソリューションの中で最も低いオーバーヘッドが生成されます。

于 2013-06-17T05:35:01.087 に答える
1

平均評価にはキャッシュを使用することをお勧めします。例えば

user has_many ratings

rating belongs_to :user

次に、評価モデルでは、平均評価をユーザーに保存するための after_save call_back を使用できます。これを達成するには、投稿モデルに average_ratings 列が必要です。

そして rating.rb では:

after_save :update_average_ratings

private

def update_average_ratings
  average_ratings = self.user.ratings.collect(&:rating).sum / self.user.ratings.count
 user.update_attributes(average_ratings: average_ratings)

end

これは非常に効率的で、必要なときに @user.average_ratings を呼び出すことができます。

それが役立つことを願っています

于 2013-06-17T05:35:47.907 に答える