Rails4의 경우 :
따라서 원하는 것은 내부 조인이므로 조인 조건자를 사용해야합니다.
Foo.joins(:bar)
Select * from Foo Inner Join Bars ...
그러나 레코드의 경우 "NOT NULL"조건을 원하면 not 술어를 사용하십시오.
Foo.includes(:bar).where.not(bars: {id: nil})
Select * from Foo Left Outer Join Bars on .. WHERE bars.id IS NOT NULL
이 구문은 사용 중단을보고합니다 (문자열 SQL 스 니펫에 대해 이야기하지만 구문 분석기에서 해시 조건이 문자열로 변경 되었습니까?). 끝에 참조를 추가해야합니다.
Foo.includes(:bar).where.not(bars: {id: nil}).references(:bar)
감가 상각 경고 : 문자열 SQL 스 니펫에서 참조되는 테이블 (하나 중 하나 : ....)을 열망하는 것처럼 보입니다. 예를 들면 다음과 같습니다.
Post.includes(:comments).where("comments.title = 'foo'")
현재 Active Record는 문자열의 테이블을 인식하고 주석을 별도의 쿼리에로드하지 않고 주석 테이블을 쿼리에 참여시키는 것을 알고 있습니다. 그러나 완전한 SQL 파서를 작성하지 않고이 작업을 수행하는 것은 본질적으로 결함이 있습니다. 우리는 SQL 파서를 작성하고 싶지 않기 때문에이 기능을 제거하고 있습니다. 이제부터는 문자열에서 테이블을 참조 할 때 명시 적으로 Active Record에 알려야합니다.
Post.includes(:comments).where("comments.title = 'foo'").references(:comments)
!nil
로 평가true
루비, 그리고 ARel는 번역true
에1
SQL 쿼리한다. 따라서 생성 된 쿼리는 실제로 요청한 것입니다. 이것은 ARel 버그가 아닙니다.