Nếu bạn có sự liên kết giữa Review
và Audio
sau đó một cái gì đó như thế này:
revs = Review.joins(:audios)
.group('style_id')
.select('style_id, avg(col1) as avg_col1, avg(col2) as avg_col2')
Điều đó sẽ cung cấp danh sách Review
các phiên bản trong revs
và những trường hợp đó sẽ có thêm avg_col1
và avg_col2
các phương pháp để truy cập giá trị trung bình cũng như style
thông thường / style_id
ngoại trừ các phương pháp của trình truy cập cột khác mà Review
thông thường cung cấp sẽ đưa ra các ngoại lệ.
Nếu bạn chưa thiết lập các liên kết thì bạn có thể thực hiện THAM GIA theo cách thủ công:
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')
Nếu tất cả những gì bạn cần chỉ là dữ liệu thô mà không có tất cả gói ActiveRecord và chi phí, thì bạn có thể thực thi SQL thô và băm nó bằng tay bằng cách sử dụng 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
Điều đó sẽ cung cấp cho bạn một Mảng băm. Bạn thậm chí có thể đơn giản hóa cách tiếp cận đó bằng cách sử dụng Struct
để tạo các lớp trình bao bọc dữ liệu đơn giản:
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
Tái bút:Không sử dụng các điều kiện kết hợp ngầm định trong SQL của bạn, đó chỉ là một cách nhanh chóng và dễ dàng để tạo ra các sản phẩm chéo, hãy sử dụng các điều kiện kết hợp rõ ràng:
SELECT ...
FROM reviews JOIN audios ON reviews.consumer_id = audios.consumer_id
GROUP BY style_id