0

1つのスタイルには多くのレビューがあります。

私がやっているとしましょう:

Style.select('styles.id').
    joins(:reviews).
    select('reviews.style_id, count(reviews.id) AS review_count')

…でも総レビュー数も知りたい!その情報も引き出す​​ことは可能ですか?count(*) を total_reviews として試しましたが、これでもスタイルごとのレビュー数が返されます。

4

1 に答える 1

1

SQL で考えると、多数の行 (つまり、そのサブセット) を作成しており、各行にその行のカウントを入れています。

反対側では、合計数が必要です。取得されたレコードのどれがその合計を持つ必要があり、どの列/属性にありますか?

Railsでそれができないのではなく、SQL自体でそれができないということです。結果セットはまったく異なるため、2 つのクエリが必要になるため、2 つの ActiveRecord 呼び出しが必要になります。

これにアプローチする別の方法 (ここでも 2 つの別個のクエリが必要ですが、より単純です) は、次のように counter_cache を使用することです@style.reviews

# add a 'reviews_count' integer column to the 'styles' table and use it as 
# a counter cache as follows
class Review < AR::Base
  belongs_to :style, :counter_cache => true
end

これで、結合を必要とせずにカウントが得られ、単純な合計で合計カウントを取得できます。

補遺: ocounter キャッシュを使用するには、通常どおりstyles(インクルードまたは結合なしで) テーブルにクエリを実行し、

@style.reviews.size

レビューの数を取得したいときはいつでも。@styleこれは別のクエリを作成せず、代わりにインスタンス自体でキャッシュされたカウンターを使用します。

于 2012-11-06T10:29:19.463 に答える