2012-09-07 3 views
1

나에게 챕터가있는 (예 :) 책 목록을 반환하는 범위가 필요합니다. 나는 this post을 찾았다.CROSS JOIN이 적용된 고급 레일 3 범위

챕터가있는 책을 선택하는 데 도움이되었습니다. 하지만 내가 원하는 장을 선택하고 싶다면 :

class Book 
     scope :long, joins(:chapters). 
     select('books.id, count(chapters.id) as n_chapters'). 
     group('books.id'). 
     having('n_chapters = 0') 
    end 

이 스코프는 아무 것도 반환하지 않습니다. 너 나 좀 도와 줄 수있어?

답변

2

joins을 사용하면 이미 연결이있는 책 + 챕터 의 모든 조합과 관계를 맺게됩니다. 이 작업은 INNER JOIN SQL 절로 수행됩니다. 모든 가능한 조합을 만들려면 OUTER JOIN을 만들어야합니다 (book + nullified 장 포함).

대신 NOT IN SQL-절을 사용하여 고려,이 경우

joins('LEFT OUTER JOIN chapters ON books.id=chapters.book_id'). 

그러나

joins(:chapters). 

를 교체합니다. 예 :

scope :long, lambda { where('id NOT IN (%s)' % Chapter.select(:book_id).to_sql) } 

상당히 작고 빠르며 읽기 쉽고 유지하기 쉬운 구조입니다.

+0

위대한 친구 야! 이 두 가지 솔루션 모두 잘 작동합니다. 이 빠르고 유능한 도움에 대해 너무 기쁩니다. 좋은 주말 보내길 바래 ;) – DarkFurios