2012-11-01 1 views
0

협회가 특정 조건을 충족하는 경우 모델의 모든 레코드를 가져옵니다 만, B가 될 수 있습니다 없는. B belongs_to A. B에는 "visible"이라고하는 부울 필드가 있습니다.의 관계가 null는 아니고, 내가 레일 3.1.0</p> <p>나는 두 가지 모델, A와 B has_one의 B를 사용하고

null이 아닌 B와 "visible"이 설정된 B가 모두 true로 설정된 모든 A 레코드를 가져 오려고합니다.

이 쿼리를 수행하는 간결하고 효율적인 방법은 무엇입니까?

내가 지금까지했던 어떤 :

나는 유도 할 수있는 범위를 생성와 A의 null 이외의 B의 (나는 생각한다).

범위 : 체인 방법이이 범위로 표시 == 참 상태가된다 ([ID] .not_eq (무) B.arel_table)

(b)는 어디에요 has_b 포함?

답변

2
A.includes(:bs).where(:bs => { :visible => true }) 

자크 켐프가

그래서 거의 옳았 범위 :

scope as_with_visible_bs includes(:bs) 
    .where(B.arel_table[:id].not_eq(nil)) 
    .where(:bs => { :visible => true }) 
0

'조인'섹션 here을 살펴보십시오. 이 쿼리는 당신이 필요로하는 무엇을 수행해야합니다

A.joins(:bs).where(:bs => { :visible => true }) 
+0

그것은 dublicated의 컬렉션을 반환 :로 – antiqe