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
흠, 이상합니다. 또한이 두 가지 상황 각각에 대해 로그에서 생성 된 SQL을 추가 할 수 있습니까? 어쩌면 그 문제에 대한 단서를 제공 할 수 있습니다. 나는 서로에 대해'has_many' 관계가있는 세 개의 모델을 가진 자신의 프로젝트 중 하나에서 시도해 보았습니다. 먼저 변수에 저장했는지 여부에 관계없이 올바른 숫자를 반환했습니다. 또한 두 경우 모두 동일한 SQL이 생성됩니다. – Mischa
Update1에는 SQL이 들어 있습니다. Thx – macsig
범위가 * 정확히 * * 어떻게 보이나요? 모든 조건은 귀하의 질문에 매우 부합됩니다. – Mischa