ОСТАВЛЕННЫЕ Внешние объединения в направляющих 3

У меня есть следующий код:

@posts = Post.joins(:user).joins(:blog).select

который предназначен, чтобы найти все сообщения и возвратить их и связанных пользователей и блоги. Однако пользователи являются дополнительными, что означает что INNER JOIN это :joins генерирует не возвращает много записей.

Как я использую это для генерации a LEFT OUTER JOIN вместо этого?

85
задан Neil Middleton 9 August 2013 в 16:06
поделиться

2 ответа

@posts = Post.joins("LEFT OUTER JOIN users ON users.id = posts.user_id").
              joins(:blog).select
111
ответ дан 24 November 2019 в 08:12
поделиться

По умолчанию, когда вы передаете ActiveRecord::Base#joins именованную ассоциацию, она будет выполнять INNER JOIN. Вы должны передать строку, представляющую ваше LEFT OUTER JOIN.

Из документации:

:joins - Либо фрагмент SQL для дополнительных объединений типа "LEFT JOIN comments ON comments.post_id = id" (требуется редко), именованные объединения в той же форме, которая используется для опции :include, которая будет выполнять INNER JOIN на связанной(ых) таблице(ях), или массив, содержащий смесь строк и именованных ассоциаций.

Если значением является строка, то записи будут возвращены только для чтения, так как они будут имеют атрибуты, которые не соответствуют столбцам таблицы. Передача :readonly => false для переопределения.

8
ответ дан 24 November 2019 в 08:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: