У меня есть следующий код:
@posts = Post.joins(:user).joins(:blog).select
который предназначен, чтобы найти все сообщения и возвратить их и связанных пользователей и блоги. Однако пользователи являются дополнительными, что означает что INNER JOIN
это :joins
генерирует не возвращает много записей.
Как я использую это для генерации a LEFT OUTER JOIN
вместо этого?
@posts = Post.joins("LEFT OUTER JOIN users ON users.id = posts.user_id").
joins(:blog).select
По умолчанию, когда вы передаете ActiveRecord::Base#joins
именованную ассоциацию, она будет выполнять INNER JOIN. Вы должны передать строку, представляющую ваше LEFT OUTER JOIN.
Из документации:
:joins
- Либо фрагмент SQL для дополнительных объединений типа "LEFT JOIN comments ON comments.post_id = id
" (требуется редко), именованные объединения в той же форме, которая используется для опции:include
, которая будет выполнять INNER JOIN на связанной(ых) таблице(ях), или массив, содержащий смесь строк и именованных ассоциаций.Если значением является строка, то записи будут возвращены только для чтения, так как они будут имеют атрибуты, которые не соответствуют столбцам таблицы. Передача
:readonly => false
для переопределения.