Я запускаю Ruby on Rails 3.1. Я прочитал следующие статьи и документацию об активной загрузке, и я хотел бы найти правильный способ сделать что-то:
- Ожидающие ассоциации загрузки [Официальная документация]
- ActiveRecord:: Ассоциации:: ClassMethods (см. раздел "Нежелательная загрузка ассоциаций" ) [Официальная документация]
- Оживленная загрузка [Статья в блоге]
# 2 говорит:
Обратите внимание, что с использованием таких условий, как Post.includes([: author,: comments]), где (['comments.approved =?', true]), все могут иметь непреднамеренные последствия.
# 3 говорит, что эти непредвиденные последствия (примечание: примеры довольно одинаковы, поэтому я цитирую точный текст статьи в блоге, но вы должны иметь в виду обходной путь, а не конкретный реализация):
Этот запрос, так как он будет использовать LEFT JOIN, также будет отбрасывать все сообщения без комментария со словом "первым" по любому из своих комментариев.
То есть, если есть "связанные" объекты, "основной связанный" объект не будет загружен. Это то, что происходит, когда я пытаюсь использовать активную загрузку, добавив некоторое условие, например .where(:category_relationships => {:user_id => @current_user.id})
в предыдущий вопрос , но я не хочу, чтобы это произошло.
Итак (пораженческий, потому что я, вероятно, не могу использовать загрузку в моем случае, когда условие не может быть установлено в операторе has_many
- обратите внимание, что в приведенном выше коде @current_user.id
"устанавливается динамически" в отличие от приведенных примеров в упомянутых местах), я хотел бы знать, существуют ли методы/методы/стратегии, чтобы ограничить запросы к базе данных, поскольку у меня есть "проблема N + 1".
Возможно, эти методы/методы/стратегии могут быть реализованы с использованием структуры Ruby on Rails... # 1 говорит:
Даже несмотря на то, что Active Record позволяет вам задавать условия для желающих загруженные ассоциации, как и объединения, рекомендуется использовать вместо этого присоединяется.
Что и как решить эту проблему правильно?
Может быть, решение состоит в том, чтобы извлекать и строить себя, что нужно загружать, запуская конкретные и разделенные запросы к базе данных, но тогда проблема заключалась бы в том, как "передавать" / "ассоциировать" / "интерполировать" найденные "связанные" объекты к "основному ассоциированному" объекту, чтобы можно было использовать способ "посторонней загрузки"? То есть, как сделать возможным (см. упомянутый вопрос для получения дополнительной информации) использовать код типа @article.comments
и получать только те комментарии, которые я загрузил самостоятельно? После моей загруженной загрузки возможно ли/правильно сделать что-то вроде @article.comments = my_eager_loaded_comments
, чтобы "передавать" / "ассоциировать" / "интерполировать" комментарии к статьям?