includes
присоединится к таблице, только если вы установили ссылку на ассоциацию.
При использовании includes
вы обеспечите ссылку на ассоциацию в 2 модах:
Вы можете использовать метод references
, он присоединится к таблице независимо от того, есть ли какие-либо условия запроса (если вы ДОЛЖНЫ использовать необработанный SQL, как показано в вашем вопросе, тогда этот метод вам нужно будет использовать), например
current_location.jobs
.includes(:customer)
.references(:customer)
Или вы можете использовать версию поиска хеша where
: (Обратите внимание, что при использовании ассоциативной ссылки в предложении where вы должны ссылаться на имя таблицы, в данном случаеcustomers
, а не имя ассоциации customer
)
current_location.jobs
.includes(:customer)
.where(customers: {first_name: "Bob" })
Оба из них будут загружать customer
для jobs
, на который ссылаются.
Первый параметр (references
) будет ВНЕШНЕЕ ПРИСОЕДИНЯТЬСЯ к таблице customers
, так что все задания загружаются, даже если у них нет клиентов, если условия запроса не ссылаются на таблицу customers
.
Второй вариант (с использованием where
) будет ВНЕШНЕЕ СОЕДИНИТЬ с таблицей клиентов, но с учетом параметра запроса к таблице клиентов он будет очень похож на ВНУТРЕННЕЕ СОЕДИНЕНИЕ.
Если вам нужно толькодля поиска jobs
на основе customer
информации, тогда joins
будет лучшим выбором, поскольку это создаст ВНУТРЕННЕЕ СОЕДИНЕНИЕ с таблицей клиентов, но не будет пытаться загрузить какие-либо данные о клиентах в запросе, например,
current_location.jobs.joins(:customer).where(customers: {first_name: "Bob" })
joins
всегда будет включать связанную таблицу независимо от ссылки в запросе.
Sidenote: all
в обоих ваших запросах совершенно не требуется