Jika Anda memiliki hubungan antara Review
dan Audio
lalu seperti ini:
revs = Review.joins(:audios)
.group('style_id')
.select('style_id, avg(col1) as avg_col1, avg(col2) as avg_col2')
Itu akan memberikan daftar Review
contoh di revs
dan instance tersebut akan memiliki avg_col1
tambahan dan avg_col2
metode untuk mengakses rata-rata serta style
biasa /style_id
tetapi metode pengakses kolom lain yang Review
biasanya akan menawarkan akan menimbulkan pengecualian.
Jika Anda belum mengatur asosiasi, Anda dapat melakukan JOIN secara manual:
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')
Jika yang Anda butuhkan hanyalah data mentah tanpa semua pembungkus dan overhead ActiveRecord, maka Anda dapat menjalankan SQL mentah dan hashify dengan tangan menggunakan 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
Itu akan memberi Anda Array Hash. Anda bahkan dapat menyederhanakan pendekatan tersebut menggunakan Struct
untuk membuat kelas pembungkus data sederhana:
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:Jangan gunakan kondisi gabungan implisit SQL Anda, itu hanya cara cepat dan mudah untuk menghasilkan produk silang, gunakan kondisi gabungan eksplisit:
SELECT ...
FROM reviews JOIN audios ON reviews.consumer_id = audios.consumer_id
GROUP BY style_id