2013-03-11 3 views
0

내가 3 개 모델이 있습니다 Feature에서레일 중첩/멀티 레벨 AREL 쿼리

Tiersets 
    has_many Tiers 

Tiers 
    belongs_to Tierset 
    has_and_belongs_to_many Features 

Feature 
    has_and_belongs_to_many Tiers 

을, 나는 다음과 같은 문자열 중 하나를 포함 Feature_Code라는 String 열이 : "F_VIZ", "F_DATA", " F_SCORE ".

나는, 알려진 Tierset 내에서 찾는 쿼리를 만들려고 노력하는 Tierset에 대한 모든 Tier 오브젝트 코드 F_VIZ와 모든 Feature 개체를하고있다.

AREL 쿼리에 포함하는 조합을 여러 번 시도했지만 분명히 테이블이 결합되는 방식과 혼합되어 있습니다. 어떤 도움이라도 대단히 감사합니다.

AR 때문에, 조금 청소기입니다
Feature.joins(:tiers).where(:code => 'F_VIZ', 'tiers.tierset_id' => 1) 

가 사이의 암시 적 조인 테이블에 대해 '알고있다'

답변

1

원하는 SQL은

select * from features, features_tiers, tiers where features_tiers.id = features.id and features_tiers.tier_id = tiers.id and features.code = 'F_VIZ' AND tierset_id = ?; 

그래서 우리는 액티브로 직접 번역 것입니다 기능 및 계층을 설정합니다.

+0

감사합니다. 필자는 'F_VIZ'를 직접 검색하지 않았기 때문에 약간 수정해야했지만 코드 이름에 'VIZ'가있는 레코드 (고유 한 레코드를 찾고 있으므로 끝에 .uniq가 추가됨) :' ("tiers.tierset_id"=> 1) .uniq' – tarunsachdeva

+0

하나의 이상한 일이 일어나고 있습니다. 위의 쿼리에서'.count'는 실제로 고유하지 않은 모든 비 고유 항목의 수를 실제로 반환합니다. 내 db (Postgres)가 다른 방식으로 조인을 처리 중이기 때문에 이것이 맞는지 확실하지 않습니다. 임무가 중요하지 않고 내 응용 프로그램에 영향을 미치지 않습니다 ...하지만 이상합니다. – tarunsachdeva

+1

'.count' 대신'.length'를 사용해야합니다. 전자는 Ruby에서 평가되고 후자는 데이터베이스에서 COUNT (*)로 평가됩니다. – bdon