Dla Rails4:
Więc to, czego chcesz, to połączenie wewnętrzne, więc naprawdę powinieneś po prostu użyć predykatu złączeń:
Foo.joins(:bar)
Select * from Foo Inner Join Bars ...
Ale, dla przypomnienia, jeśli chcesz warunek „NOT NULL”, po prostu użyj predykatu:
Foo.includes(:bar).where.not(bars: {id: nil})
Select * from Foo Left Outer Join Bars on .. WHERE bars.id IS NOT NULL
Zauważ, że ta składnia zgłasza wycofanie (mówi o fragmencie kodu SQL, ale myślę, że warunek skrótu został zmieniony na string w parserze?), Więc pamiętaj, aby dodać odwołania na końcu:
Foo.includes(:bar).where.not(bars: {id: nil}).references(:bar)
OSTRZEŻENIE DOTYCZĄCE DEPRECACJI: Wygląda na to, że chętnie ładujesz tabele (jeden z: ....), do których odwołuje się ciąg kodu SQL. Na przykład:
Post.includes(:comments).where("comments.title = 'foo'")
Obecnie Active Record rozpoznaje tabelę w ciągu i wie, DOŁĄCZYĆ tabelę komentarzy do zapytania, zamiast ładować komentarze w oddzielnym zapytaniu. Jednak robienie tego bez pisania pełnego parsera SQL jest z natury wadliwe. Ponieważ nie chcemy pisać analizatora składni SQL, usuwamy tę funkcję. Odtąd musisz jawnie informować Active Record, gdy odwołujesz się do tabeli z ciągu:
Post.includes(:comments).where("comments.title = 'foo'").references(:comments)
!nil
Zwracatrue
w Ruby i AREL przekładatrue
się1
w zapytaniu SQL. Tak więc wygenerowane zapytanie jest tym, o co prosiłeś - nie był to błąd ARel.