Альтернативный подход к тому из Зубина:

вязано с вопросомгод и изменение назад.

Я поставил пример вопроса, который должен работать из коробки, при условии, что у вас есть sqlite3:https://github.com/cairo140/rails-eager-loading-counts-demo

Инструкция по установке (для основной ветки)
git clone git://github.com/cairo140/rails-eager-loading-counts-demo.git
cd rails-eager-loading-counts-demo
rails s

У меня есть более полная запись в хранилище, но мой общий вопрос заключается в следующем.

Как я могу заставить Rails активно рассчитывать нагрузку таким образом, чтобы минимизировать количество запросов в базу данных по всем направлениям?

n+1 проблема возникает всякий раз, когда вы используете#count на ассоциации, несмотря на то, что включение этой ассоциации через#includes(:associated) в ActiveRelation. Обходной путь должен использовать#length, но это работает хорошо только тогда, когда объект, к которому он вызывается, уже загружен, не говоря уже о том, что я подозреваю, что он дублирует что-то, что внутренности Rails уже сделали. Также проблема с использованием#length в том, что это приводит к неудачной перегрузке, когда ассоциация не была загружена с самого начала, и это все, что вам нужно.

Из readme:

Мы можем избежать этой проблемы, запустив #length в массиве posts (см. Приложение), который уже загружен, но было бы хорошо, если бы count также был легко доступен. Мало того, что это более последовательно; он обеспечивает путь доступа, который не обязательно требует загрузки сообщений. Например, если у вас есть частичное, которое отображает счет независимо от того, что, но половину времени, частичное вызывается с загруженными сообщениями, а половину - без, вы сталкиваетесь со следующим сценарием:

С помощью#countn COUNT запросы стиля, когда сообщения уже загруженыn COUNT запросы стиля, когда сообщения еще не загруженыС помощью#lengthНоль дополнительных запросов, когда сообщения уже загруженыn * запросы стиля, когда сообщения еще не загружены

Между этими двумя вариантами нет доминирующего варианта. Но было бы неплохо изменить #count, чтобы отложить до #length или получить доступ к длине, которая каким-то другим образом хранится за кулисами, чтобы у нас был следующий сценарий:

Используя пересмотренный#countНоль дополнительных запросов, когда сообщения уже загруженыn COUNT запросы стиля, когда сообщения еще не загружены

Так какой правильный подход здесь? Есть ли что-то, что я упустил (очень, очень вероятно)?

Ответы на вопрос(4)

Ваш ответ на вопрос