Para Rails4:
Então, o que você quer é uma junção interna, então você realmente deve usar o predicado de junções:
Foo.joins(:bar)
Select * from Foo Inner Join Bars ...
Mas, para o registro, se você deseja uma condição "NOT NULL", basta usar o não predicado:
Foo.includes(:bar).where.not(bars: {id: nil})
Select * from Foo Left Outer Join Bars on .. WHERE bars.id IS NOT NULL
Observe que essa sintaxe relata uma descontinuação (ela fala sobre um trecho de código SQL, mas acho que a condição de hash foi alterada para string no analisador?), Portanto, adicione as referências ao final:
Foo.includes(:bar).where.not(bars: {id: nil}).references(:bar)
AVISO DE DEPRECAÇÃO: Parece que você está ansioso para carregar a (s) tabela (s) (uma de: ....) que são referenciadas em um snippet SQL de sequência. Por exemplo:
Post.includes(:comments).where("comments.title = 'foo'")
Atualmente, o Active Record reconhece a tabela na string e sabe JOIN a tabela de comentários na consulta, em vez de carregar comentários em uma consulta separada. No entanto, fazer isso sem gravar um analisador SQL completo é inerentemente defeituoso. Como não queremos escrever um analisador SQL, estamos removendo essa funcionalidade. A partir de agora, você deve informar explicitamente o Active Record ao fazer referência a uma tabela a partir de uma sequência:
Post.includes(:comments).where("comments.title = 'foo'").references(:comments)
!nil
Avalia comotrue
em Ruby, e Arel traduztrue
a1
em uma consulta SQL. Portanto, a consulta gerada é de fato o que você solicitou - não foi um bug do ARel.