1

3 개의 간단한 모델이 있고 섹터, 부서, 사무실이라고합시다. 부문에는 많은 부서가 있으며 부서에는 많은 사무실이 있습니다.더블 딥 관련 레코드가있는 레코드 가져 오기

이제 적어도 사무실이있는 부서가있는 모든 섹터를 얻고 싶습니다.

나는 두 가지 다른 방법을 시도했으며 "다소간"작동합니다. 나는 내가 Sector.with_offices를 호출하면 원하는 것을 얻는다는 것을 의미한다. 그러나 .size (원래 쿼리에 카운트를 추가하는)와 같은 꽤 일반적인 메서드를 연결하면 예기치 않은 결과가 발생한다. 이 같은 문제를 가지고,

scope :with_offices, joins(:departments => :offices).uniq 

을하지만 :

scope :with_offices, joins(:departments => :offices).group('sectors.id') 
scope :with_offices, joins(:departments => :offices).select("DISTINCT sectors.*") 

가 나는 또한 uniq를 사용하여 시도 : 여기에 내가 무엇을 시도했다.

Sector.with_offices.size # => 5 (WRONG VALUE) 
s = Sector.with_offices # => [#<Sector ... >] 
s.size # => 3 (RIGHT VALUE) 

내가 잘못하면 번호가 잘못되었습니다.

사무실이있는 섹터를 얻고 크기가 예상대로 유지되는 명확한 방법은 무엇입니까?

업데이트 1 - THE SQL QUERIES 여기 내 쿼리에서 두 연관에 상태를 제한하는 조건 절이 있음을 잊어 버렸습니다 (아래 그림 참조).

irb(main):010:0> Sector.with_offices.size 
    (0.6ms) SELECT DISTINCT COUNT(*) FROM "sectors" INNER JOIN "departments" ON "departments"."sector_id" = "sectors"."id" AND departments.state IN ('active', 'deactivated') INNER JOIN "offices" ON "offices"."department_id" = "departments"."id" AND offices.state IN ('active', 'deactivated') WHERE "sectors"."state" IN ('active', 'deactivated') 
=> 5 


irb(main):011:0> s = Sector.with_offices 
    Sector Load (0.6ms) SELECT DISTINCT "sectors".* FROM "sectors" INNER JOIN "departments" ON "departments"."sector_id" = "sectors"."id" AND departments.state IN ('active', 'deactivated') INNER JOIN "offices" ON "offices"."department_id" = "departments"."id" AND offices.state IN ('active', 'deactivated') WHERE "sectors"."state" IN ('active', 'deactivated') 

업데이트 2 - 협회

Class Sector < ActiveRecord::Base 
has_many :departments , conditions: ["departments.state IN ('active', 'deactivated')"] 
end 

Class Department < ActiveRecord::Base 
has_many :offices , conditions: ["offices.state IN ('active', 'deactivated')"] 
end 
+0

흠, 이상합니다. 또한이 두 가지 상황 각각에 대해 로그에서 생성 된 SQL을 추가 할 수 있습니까? 어쩌면 그 문제에 대한 단서를 제공 할 수 있습니다. 나는 서로에 대해'has_many' 관계가있는 세 개의 모델을 가진 자신의 프로젝트 중 하나에서 시도해 보았습니다. 먼저 변수에 저장했는지 여부에 관계없이 올바른 숫자를 반환했습니다. 또한 두 경우 모두 동일한 SQL이 생성됩니다. – Mischa

+0

Update1에는 SQL이 들어 있습니다. Thx – macsig

+0

범위가 * 정확히 * * 어떻게 보이나요? 모든 조건은 귀하의 질문에 매우 부합됩니다. – Mischa

답변

1

나는 그것을 시도하고 분명히 3.2.13에서 수정되었습니다 3.2.12의 버그입니다. 3.2.13으로 업그레이드하면 올바른 SQL이 생성됩니다.

+0

감사. 나는 최대한 빨리 할 것입니다. – macsig

+0

@macsig - 감사합니다! – Mischa

관련 문제