Для 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)