Para Rails4:
Entonces, lo que quieres es una combinación interna, por lo que realmente deberías usar el predicado de combinaciones:
Foo.joins(:bar)
Select * from Foo Inner Join Bars ...
Pero, para el registro, si desea una condición "NOT NULL" simplemente use el predicado not:
Foo.includes(:bar).where.not(bars: {id: nil})
Select * from Foo Left Outer Join Bars on .. WHERE bars.id IS NOT NULL
Tenga en cuenta que esta sintaxis informa una desuso (habla de un fragmento de cadena SQL, pero supongo que la condición de hash se cambia a cadena en el analizador), así que asegúrese de agregar las referencias al final:
Foo.includes(:bar).where.not(bars: {id: nil}).references(:bar)
ADVERTENCIA DE DEPRECACIÓN: Parece que está ansioso por cargar tablas (una de: ....) a las que se hace referencia en un fragmento de cadena de SQL. Por ejemplo:
Post.includes(:comments).where("comments.title = 'foo'")
Actualmente, Active Record reconoce la tabla en la cadena y sabe UNIR la tabla de comentarios a la consulta, en lugar de cargar comentarios en una consulta separada. Sin embargo, hacer esto sin escribir un analizador SQL completo es inherentemente defectuoso. Como no queremos escribir un analizador SQL, estamos eliminando esta funcionalidad. A partir de ahora, debe indicar explícitamente a Active Record cuando hace referencia a una tabla desde una cadena:
Post.includes(:comments).where("comments.title = 'foo'").references(:comments)
!nil
se evalúa comotrue
en Ruby, y Arel se traducetrue
a1
una consulta SQL. Entonces, la consulta generada es, de hecho, lo que solicitó, esto no fue un error de ARel.