2012-03-17 13 views
4

たとえば、商品レビューが100件あるテーブルがあります。各レビューには「id」、「product_id」、「score」があります。さて、私がしたいのは、各製品の平均得点です...これを行うためにRailsを使用してDBにクエリを行う方法はありますか?私はそこにいるはずだと確信していますが、私はそれを理解できません。私は次のことが起こりたいと思っています:activerecordとPOSTGRESを使用して商品の平均評点を平均化する方法

Toyota Corolla 70% 
Toyota Camry 78% 
Toyota Avalon 80% 

平均して複数のレビューに基づいていますが、上記の方法で表示されています。

UPDATE:溶液中の興味のある人のため

これはコントローラである。

@ordered_hash = Review.group('aidmodel_id').average('score') 
@keys = @ordered_hash.keys 
@reviews = Review.where(:aidmodel_id=>@keys).uniq_by {|x| x.aidmodel_id} 

これはビューである:

<% @reviews.each do |review| %> 

    <%= review.aidmodel.id %> 
    <%= @ordered_hash[review.aidmodel_id] %> 

    <% end %> 

@ordered_hash[review.aidmodel_id]ラインが提供所望のIDを有する援助モデルの平均スコア。

答えて

6

あなたは

MyClass.select('product_id').group('product_id').average('score') 

としてクエリを変更する必要が

MyClass.group('product_id').average('score') 
# => {product_id1 => average1, product_id2 => average2, ... } 
+0

おかげBaldrickを試してみてください。私のためにちょうど1つの問題。 Railsコンソールで実行するとエラーが表示されます:ActiveRecord :: StatementInvalid:PG :: Error:ERROR:列 "reviews.created_at"は、GROUP BY句に現れなければならないか、集約関数で使用する必要があります。これを引き起こしているのは何ですか? – Abram

+0

私は単純にconsole(aidmodel_idは私の場合はproduct_idと同じです)で以下を実行しました:Review.group( 'aidmodel_id')。average( 'score') – Abram

+0

なぜこのエラーがあるのか​​分かりません。私は自分のモデルでテストしたところ、次のSQLリクエスト 'Match.group( 'championship_id')を返しましたaverage( 'date')' => '(30.0ms)SELECT AVG(" matches "。" date ")AS average_date、championship_id AS championship_id FROM" matches "GROUP BY championship_id' – Baldrick

1

ような何かをaveragegroupを混在させることができますがquestionを見てみましょう。

更新:

はここMyClass.select('DISTINCT(product_id)').group('product_id').average('score')

ルックgroup by in postgres

+0

残念ながら私は同じエラーが発生しています:SELECT AVG( "reviews"、 "score")AS average_score、aidmodel_id AS aidmodel_id FROM "reviews" GROUP BY aidmodel_id ORDER BY reviews.created_at DESC ActiveRecord :: StatementInvalid:PG :: Error:エラー:列 "reviews.created_at"は、GROUP BY句に表示するか、集計関数で使用する必要があります – Abram

+0

これはうまくいくと私の答えが編集されました。 – asitmoharna

+0

非常に申し訳ありませんが、まだ同じエラーがあります – Abram