2012-05-15 3 views
1

가정하자 나는이 다음과 같은 모델을 피하기 :레일 3 중첩 쿼리는 SQL

class Foo < ActiveRecord::Base 
    belongs_to :bar 
end 

class Bar < ActiveRecord::Base 
    belongs_to :a 
    belongs_to :b 
end 

내가 찾으려는 모든 a_idb_id에 의해 Bar 및 그룹화를 포함하여 Foos.

나는 다음과 같은 쿼리가 작동 확신 : 그룹 문에서 SQL을 작성하지 않고 그 일을하는 방법이 있는지 궁금 해요

Foo.joins(:bar).group('bar.a_id, bar.b_id').all 

?

이 쿼리 스타일은 소위 하위 질문

나는 그것의 전체 문서를 읽을 수 있습니까? 레일 쿼리 가이드에는 여러 스타일이 혼합되어 있으며 그 중 어떤 것에 대해서도 자세히 설명하지 않습니다.

답변

1

스타일 혼합은 해시를 사용하는 스타일이 현재 가능한 모든 SQL 쿼리를 설명 할 수 없기 때문에 가능합니다. 따라서 항상 문자열 사용의 후퇴가 있습니다.

당신이 제공 한 쿼리가 작동하며, 문자열이 매우 표준적인 SQL이기 때문에 사용해서는 안되며, 다른 데이터베이스를 사용하면 실패하지 않아야합니다.

그러나 문자열없이 작성할 수 있습니다.

기본적으로 Foo의 모든 필드가 선택되었으므로 작성된 현재 쿼리는 오류를 던질 수 있습니다. 단, 그룹에서는 집계 함수 또는 그룹별로 그룹을 선택할 수 있습니다. 만 집계 함수가 선택되도록

Foo.select("COUNT(*) as count").joins(:bar).group([:bar => :a_id, :bar => :b_id]) 

난 그냥 select 절을 추가 :

쿼리는 무언가 같이 될 것입니다.