Для рейок4:
Отже, те, що ви хочете, - це внутрішнє приєднання, тому вам слід просто використовувати предикат приєднання:
Foo.joins(:bar)
Select * from Foo Inner Join Bars ...
Але для запису, якщо ви хочете, щоб умова "NOT NULL" просто використовувала не предикат:
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.