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