Во-первых, find
не поддерживает наличие include
или join
в качестве параметра.(Как сказал Mipsy, для find не имеет смысла поддерживать include
, поскольку это будет то же количество запросов, что и при его последующей загрузке.)
Во-вторых, include
охотно загружает ассоциацию, поэтомучто-то вроде
Person.includes(:company)
примерно эквивалентно выполнению:
Person.all.each { |person| Company.find(person.company_id)
Я говорю примерно эквивалентно тому, что первый имеет O(1)
(на самом деле два) запроса, тогда какпоследний - O(n)
запросов, где n
- количество людей.
Соединение, однако, будет одним запросом, но недостатком объединения является то, что вы не всегда можете использовать извлеченныеДанные для обновления модели.Чтобы выполнить объединение, вы должны сделать:
Person.join(:companies)
Подробнее о объединении таблиц вы можете прочитать в Руководстве по Rails .
Подводя итог, присоединение не является стремительнымзагрузка, потому что она не загружает ассоциацию, она загружает обе части данных одновременно.Я понимаю, что между ними есть странная тонкая грань, но при быстрой загрузке происходит получение других данных с опережением, но вы не получите эти данные позже через объединение, иначе вы уже получили бы их в исходном запросе!Надеюсь, что это имеет смысл.