Review
の間に関連付けがある場合 およびAudio
次に、このようなもの:
revs = Review.joins(:audios)
.group('style_id')
.select('style_id, avg(col1) as avg_col1, avg(col2) as avg_col2')
Review
のリストが表示されます revs
のインスタンス これらのインスタンスには、追加のavg_col1
があります。 およびavg_col2
平均と通常のstyle
にアクセスするためのメソッド / style_id
メソッドですが、Review
する他の列アクセサメソッド 通常、オファーは例外を発生させます。
アソシエーションを設定していない場合は、手動でJOINを実行できます:
revs = Review.joins('join audios on reviews.consumer_id = audios.consumer_id')
.group('style_id')
.select('style_id, avg(col1) as avg_col1, avg(col2) as avg_col2')
必要なのがすべてのActiveRecordラッピングとオーバーヘッドのない生データだけである場合は、生のSQLを実行し、 select_rows
:
Review.connection.select_rows(%q{
select r.style_id, avg(a.col1), avg(a.col2')
from reviews r
join audios a on r.consumer_id = a.consumer_id
group by r.style_id
}).map do
{ :style_id => r.shift, :avg_col1 => r.shift.to_f, :avg_col2 => r.shift.to_f }
end
それはあなたにハッシュの配列を与えるでしょう。 Struct
を使用して、このアプローチを単純化することもできます。
単純なデータラッパークラスを作成するには:
c = Struct.new(:style_id, :avg_col1, :avg_col2)
revs = Review.connection.select_rows(%q{...}).map do |r|
c.new(r.shift, r.shift.to_f, r.shift.to_f)
end
PS:SQLで暗黙的な結合条件を使用しないでください。これは、外積を生成するための迅速で簡単な方法です。明示的な結合条件を使用してください:
SELECT ...
FROM reviews JOIN audios ON reviews.consumer_id = audios.consumer_id
GROUP BY style_id