Я попытался использовать драгоценный камень под названием «пуля», чтобы избежать проблемы с N + 1.Почему не помогает ускорить работу?
Мой предыдущий код был
@communities = Community.scoped.page(params[:page]).order("created_at DESC")
Тогда я получаю эту ошибку
N+1 Query detected
Community => [:platform]
Add to your finder: :include => [:platform]
N+1 Query detected
Community => [:genre]
Add to your finder: :include => [:genre]
N+1 Query detected
Community => [:tags]
Add to your finder: :include => [:tags]
Затем она принимает около 650ms, чтобы показать страницу с более чем 80 SQL.
Так что я изменил его на этом
@communities = Community.scoped.page(params[:page]).order("created_at DESC").includes(:platform, :genre, :tags)
Теперь, ушла тревога пули, но он принимает 750ms и есть еще более 80 SQL.
Почему?
Я запускаю его в режиме производства. Также выполняется прекомпиляция активов. Как добавить разбивку на страницы, чтобы ограничить набор результатов? Я думал, что все в порядке, пока у меня есть 'page (params [: page])' – MKK
Нет, 'params [: page]' не поможет, если вы не вызываете его по методу запроса. Как еще Rails знает, какую страницу вы хотите? – Mohamad
вы можете здесь проверить? http://stackoverflow.com/questions/17712893/how-can-i-code-if-i-want-to-avoid-n-plus-one-issue Студент имеет 3 столбца. Он выдавал 3 sql (для извлечения Gender, BloodType и префектуры) для каждого ученика. Поэтому, когда было показано 10 учеников, было выпущено 30 запросов. После того, как я добавил 'includes', он все тот же. Зачем? Я проверяю драгоценный камень под названием «bullet» и «rack-mini-profiler» – MKK