Для Rails4:
Итак, вам нужно внутреннее соединение, так что вам просто нужно использовать предикат соединений:
Foo.joins(:bar)
Select * from Foo Inner Join Bars ...
Но, для записи, если вы хотите условие «НЕ НУЛЬ», просто используйте предикат 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
в Ruby, и AREL переводитtrue
к1
в запросе SQL. Таким образом, сгенерированный запрос фактически является тем, о чем вы просили - это не ошибка ARel.