2011-12-19 2 views
0

레일 3.0.10을 사용하고 있습니다. A Building has_many FloorsFloor has_many Suites입니다. 적어도 하나의 Suite이 포함 된 Buildings을 모두 가져오고 싶습니다. (아니 모든 건물은 그것의 스위트 룸을 보유하고, 일부는 예를 들어, 아직 공사중입니다.)레일스에서 ​​별개의 조인 된 레코드를 가져 오는 방법은 무엇입니까?

몇 가지주의 사항 : Building.joins(:floors, :suites) 같은 작동하지 않도록

  • 난 단지, 독특한 기록을합니다.

  • 많은 건물이 있습니다. 저는 거대한 컬렉션을 로컬로 가져오고 싶지 않고 #uniq입니다.

  • 가능한 경우 문자열 참조를 피하는 것이 좋습니다. 예를 들어, Building.joins(:floors, :suites).select("distinct buildings.id")과 같은 것을하고 싶지 않습니다.

  • 이것은 단일 SQL 쿼리에서 수행 할 수 있습니다 (예 : select distinct buildings.id from buildings inner join floors on floors.building_id = buildings.id inner join suites on suites.floor_id;). 따라서이 접근 방식이 하나의 쿼리 만 사용하는 것이 가장 좋습니다.

레일즈 코어를 사용하는 ActiveRecord/ARel/기타 의미를 사용하여 가장 좋은 방법은 무엇입니까? 이 작업을 수행하는 여러 가지 방법을 생각해 냈지만 가장 정교한 것이 무엇인지 확신 할 수 없습니다. 3 SQL-쿼리

답변

1

: 당신은 메모리에 모든`Floor`의 모든`Suite`를로드하기 때문에

Building.where(:id => Floor.where(:id => Suite.all.collect(&:floor_id).uniq).collect(&:building_id)) 
+0

이 IMO, 이것은 좋은 방법이 아니다. 불필요하게 인스턴스화 된 객체가 많이 있습니다! 우리는 여기서 건물을 가져오고 싶습니다. –

+0

바닥에 counter_caches를 추가하면 2 개의 SQL 쿼리 만 필요합니다.? – Lichtamberg

+0

레일 코어에 달라 붙지는 않습니다. 위에서 언급 한 조건 중 하나를 벗어납니다. 또한 SQL이 상대적으로 단순한 명령문에서이를 수행 할 수 있다면 Rails도 가능해야한다고 생각합니다. –