Нетерпеливая загрузка:Правильный способ работы

Я использую Ruby on Rails 3.1. Я прочитал следующие статьи и документацию о жадной загрузке и хотел бы найти правильный способ сделать что-то:

  1. Ассоциации жадной загрузки [Официальная документация]
  2. ActiveRecord::Ассоциации::ClassMethods(см. раздел «Жесткая загрузка ассоциаций» )[Официальная документация]
  3. Страстная загрузка [Статья в блоге]

#2 говорит:

Примечание что с использованием таких условий, как Post.includes([:author, :comments]).where(['comments.approved = ?', true]).all может иметь непредвиденные последствия.

В#3 говорится, что эти непредвиденные последствия:(примечание:примеры почти одинаковы, поэтому я цитирую точный текст статьи в блоге, но вы должны помнить об обходном пути, а не конкретная реализация):

Этот запрос, поскольку он будет использовать ЛЕВОЕ СОЕДИНЕНИЕ, также будет отбрасывать все сообщения без комментариев со словом «первый» в любом из своих комментариев.

То есть, если есть не «связанные» объекты, «основной связанный» объект не будет загружен. Вот что происходит, когда я пытаюсь использовать нетерпеливую загрузку, добавляя некоторое условие , например .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, чтобы "передавать"/"ассоциировать"/"интерполировать" комментарии к статьи?

20
задан Community 23 May 2017 в 12:16
поделиться