1

Я запускаю 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 заявление отменяет жаждущее влияние нагрузки.

ответ

3

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

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

Метод 'where' означает«/»работает на« 'category', а не на' comments'. Оба типа '' '' '' '' '' '' '' имеют атрибут 'user_id'/column. – Backo

+0

Итак, вам нужно предложение where по категориям и комментариям? Что вы имеете в виду? Ваш вопрос, похоже, связан с тем, что есть комментарии, которые не имеют 'user_id == @ current_user.id'. Мой ответ исправляет это. – Mischa

+0

Я имею в виду, что я хотел бы получить все '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

Смежные вопросы