अगर आपका 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
आम तौर पर पेशकश करेगा अपवाद उठाएगा।
यदि आपके पास एसोसिएशन स्थापित नहीं है तो आप मैन्युअल रूप से जॉइन कर सकते हैं:
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
पुनश्च:अपने एसक्यूएल में निहित शर्तों का उपयोग न करें, यह क्रॉस उत्पादों का उत्पादन करने का एक त्वरित और आसान तरीका है, स्पष्ट रूप से शामिल होने की शर्तों का उपयोग करें:
SELECT ...
FROM reviews JOIN audios ON reviews.consumer_id = audios.consumer_id
GROUP BY style_id