Проблемы с энергичной загрузкой и использованием метода «где» - PullRequest
1 голос
/ 09 марта 2012

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

1 Ответ

3 голосов
/ 09 марта 2012

В случае 1 предложение where распространяется только на категории.Если вы также хотите применить его к комментариям, вы можете сделать это:

article_categories =
  article
    .categories
    .includes(:comments)
    .where('categories.user_id = ? AND comments.user_id = ?', @current_user.id, @current_user.id)
...