Я использую 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
отменяет эффекты активной загрузки.