Я сейчас читаю "Rails 5 Way", и я дошел до раздела, охватывающего includes
и joins
. До сих пор я понимал, что includes
лучше всего подходит для активной загрузки данных БД в память, чтобы избежать N + 1 запросов, тогда как joins
больше подходит для простой фильтрации набора результатов запроса на основе связанных таблиц, без фактического доступа к атрибутам этих связанных строк таблицы:
1
включает в себя (* ассоциации)
Active Record имеет возможность устранить
«N + 1» запросов, позволяя вам указать, какие ассоциации стремятся загрузить
используя метод или опцию includes
в ваших поисках. Активная запись
загрузит эти отношения с минимальным количеством запросов
возможно.
2
объединения (выражение) joins
работает аналогично включению с использованием INNER
Присоединяйтесь к полученному SQL-запросу. Один из ключевых битов знаний для
понять о внутренних объединениях, они возвращают только набор записей
которые соответствуют таблицам, к которым присоединяются. Если ряд по обе стороны от
в соединении отсутствует соответствующая строка на другой стороне, и не будет
быть возвращен в наборе результатов.
Однако на странице 202 я вижу следующее:
3
На сегодняшний день наиболее распространенным методом joins
является выборка
данные для связанных объектов в одном операторе SELECT, чтобы
предотвратить так называемые N + 1 запросы.
Использование, описанное в цитате № 3, похоже, ближе соответствует цитате № 1, чем цитате № 2, то есть в ней говорится о цели сокращения N + 1 запросов путем активной загрузки данных (что мне известно includes
звонит либо eager_load
или preload
под капот). Честно говоря, цитата № 3 вообще не соответствует # 1.
Мой вопрос: как мы можем согласовать эти 3 цитаты друг с другом? Или они уже синхронизированы друг с другом, а я просто что-то упускаю?