如果你有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,並用手hashify它使用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
這將使你哈希值的數組。
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,這只是以產生交叉產品快速簡便的方法,使用顯式連接條件,你甚至可以使用Struct
創建簡單的數據包裝類簡化方法:
SELECT ...
FROM reviews JOIN audios ON reviews.consumer_id = audios.consumer_id
GROUP BY style_id
爲什麼轉換,執行它作爲一個原始的sql – beck03076