Нежелательные ассоциации загрузки экземпляров ActiveModel в Rails

В RoR довольно часто случается, что новые люди загружают класс и ассимиляции, такие как # решение для загрузки нагрузки

# The bellow generates an insane amount of queries
# post has many comments
# If you have 10 posts with 5 comments each
# this will run 11 queries 
posts = Post.find(:all)
posts.each do |post|
  post.comments
end

Решение довольно просто для загрузки нагрузки

# should be 2 queries
# no matter how many posts you have
posts = Post.find(:all, :include => :comments) # runs a query to get all the comments for all the posts
posts.each do |post|
  post.comments # runs a query to get the comments for that post
end

Но что, если у вас нет доступа к методам класса и есть доступ к коллекции методов экземпляра.

Затем вы застряли в интенсивной ленивой загрузке запроса.

Есть ли способ минимизировать запросы, чтобы получить все comments для коллекции posts, из коллекции экземпляров?

Дополнение для ответа (также добавлено в код выше)


Таким образом, для того, чтобы загружать из того, что я вижу в rdoc для rails, является метод класса для любого расширения ActiveRecord:: Associations, проблема в том, что у вас нет возможности использовать метод класса, поэтому вы нужно использовать какой-то метод экземпляра

пример кода, на который, как я думаю, будет выглядеть, будет что-то вроде

post = Posts.find(:all)
posts.get_all(:comments) # runs the query to build comments into each post without the class method.

Ответ 1

В Rails 3.0 и более ранних версиях вы можете:

Post.send :preload_associations, posts, :comments

Вы можете передать массивы или хэши имен ассоциаций, как вы можете включить:

Post.send :preload_associations, posts, :comments => :users

В Rails 3.1 это перемещено, и вы используете Preloader следующим образом:

ActiveRecord::Associations::Preloader.new(posts, :comments).run()

И поскольку Rails 4 его обращение изменилось на:

ActiveRecord::Associations::Preloader.new.preload(posts, :comments)

Ответ 2

Я думаю, что получаю то, о чем вы просите.

Однако я не думаю, что вам нужно беспокоиться о том, какие методы у вас есть. Отношение внешнего ключа (и ассоциации ActiveRecord, такие как has_many, belongs_to и т.д.), Позаботятся о том, как загрузить связанные записи.

Если вы можете указать конкретный пример того, что, по вашему мнению, должно произойти, и фактический код, который работает не, было бы легче увидеть, что вы получаете.

Ответ 3

Как вы получаете свою коллекцию экземпляров модели и какую версию Rails используете?

Вы говорите, что у вас нет абсолютно никакого доступа ни к контроллерам, ни к самим моделям?

дающий вам лучший ответ, зависит от знания этих вещей.