당신은 Review
및 Audio
사이의 연결이 같은이있는 경우 : revs
에 Review
인스턴스의 목록을 제공하고 그 인스턴스로 평균에 액세스하기위한 추가 avg_col1
및 avg_col2
방법이있을 것이다
revs = Review.joins(:audios)
.group('style_id')
.select('style_id, avg(col1) as avg_col1, avg(col2) as 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')
당신이 필요로하는 모든 모든 액티브 포장 및 오버 헤드없이 바로 원시 데이터 인 경우에, 당신은 실행할 수 있습니다 select_rows
를 사용하여 원시 SQL 및 손으로 hashify :
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