2012-05-17 4 views
3

가 어떻게 활성 기록 쿼리에 다음을 변환 할 수 있습니다 액티브 레코드 쿼리 레일 SQL을 조인

SELECT reviews.style_id, AVG("col1"), AVG("col2") 
    FROM reviews, audios 
WHERE reviews.consumer_id = audios.consumer_id 
GROUP BY style_id; 

col1col2는 오디오 테이블에 속하는를하지만, 고유 (더 유사한 열 이름에 이름이 없습니다 reviews), 모호성 오류가 없습니다.

저는 PostgreSQL을 사용하고 있습니다.

+0

왜 원시 SQL로 변환합니까? – beck03076

답변

6

당신은 ReviewAudio 사이의 연결이 같은이있는 경우 : revsReview 인스턴스의 목록을 제공하고 그 인스턴스로 평균에 액세스하기위한 추가 avg_col1avg_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 
+0

Mu, 고급 활성 레코드 쿼리에 대한 유용한 자습서를 알고 계십니까? 나는 더 많은 것을 배우고 싶다. 감사합니다. – Abram

+1

@Abram : [Active Record Query Interface Guide] (http://guides.rubyonrails.org/active_record_querying.html)가 있습니다. 내 머리글 상단에있는 것보다 더 잘 알지 못합니다. 레일즈 콘솔에서이 가이드를 사용하고 많은 것을 놀았습니다. 강력한 SQL-Fu는 물론 도움이됩니다. –

+1

그런데 활성 레코드 방법이 .joins가 아닌 .join .. 인 것 같습니다. 어느 쪽이든, 매우 유용합니다 .. 나는 귀하의 게시물 덕분에 놀라운 것들을 얻을 수있었습니다. 건배 – Abram