Я запускаю Ruby on Rails 3.1. Я использую метод includes
, и я хотел бы понять, почему, когда я вызываю метод where
в загруженной коллекции, он перезагружает связанные объекты, а не просто находит этот объект в загруженной коллекции. Поскольку все связанные объекты уже загружены, я ожидаю, что where
метод не ударил базу данных, чтобы перезагрузить эти объекты!Неисправность при загрузке и использовании метода «где»
То есть, у меня есть следующие:
article_categories =
article
.categories
.where(:user_id => @current_user.id)
.includes(:comments)
Если я бегу
# CASE 1:
article_categories.each do |article_category|
article_category.comments.map(&:title)
end
жадная загрузка работает, как ожидалось: "N + 1 проблема запроса" избежать. Однако приведенный выше код возвращает также названия комментариев, которые имеют не «:user_id == @current_user.id
», но я не хочу их извлекать вообще.
Так, так как я думал, что с помощью жадной загрузки я уже получить все комментарии, я использовал еще where(:user_id => @current_user.id)
заявление, как в следующем коде:
# CASE 2:
article_categories.each do |article_category|
article_category.comments.where(:user_id => @current_user.id).map(&:title)
end
Однако, в этом случае нетерпеливой загрузке делает не работает как и ожидалось: «проблема с запросом N + 1» - это не избегать ... но комментарии имеют «:user_id == @current_user.id
»!
Я хотел бы жаждущие комментарии погрузочных с «:user_id == @current_user.id
» (, как я могу сделать это, воспользовавшись из нетерпеливого загрузки?), и я хотел бы понять, почему where
заявление отменяет жаждущее влияние нагрузки.
Метод 'where' означает«/»работает на« 'category', а не на' comments'. Оба типа '' '' '' '' '' '' '' имеют атрибут 'user_id'/column. – Backo
Итак, вам нужно предложение where по категориям и комментариям? Что вы имеете в виду? Ваш вопрос, похоже, связан с тем, что есть комментарии, которые не имеют 'user_id == @ current_user.id'. Мой ответ исправляет это. – Mischa
Я имею в виду, что я хотел бы получить все 'categories.where (: user_id => @ current_user.id)' и загружать все 'article.comments.where (: category_id => category_ids,: user_id => @ current_user.id) '. 'category_ids' - это массив упомянутых« категорий.where (: user_id => @ current_user.id) ». * P.S. *: Я не знаю, был ли я ясен. – Backo