Стремление с нетерпением грузовой ассоциации с Arel (Rails 3)
-
25-09-2019 - |
Вопрос
Простая задача: Учитывая, что в статье есть много комментариев, сможем отображать в длинном списке статей, сколько комментариев есть. Я пытаюсь выработать, как предварительно загрузить эти данные с Arel.
Раздел «сложных агрегаций» ПРОЧТИ МЕНЯ Файл, по-видимому, обсуждает этот тип ситуации, но он не точно предлагает образец код, и не предлагает ли он способа сделать это в двух запросах вместо одного присоединения к запросу, что хуже для производительности.
Учитывая следующее:
class Article
has_many :comments
end
class Comment
belongs_to :article
end
Как я могу предварительно загрузить для статьи, сколько комментариев у каждого есть?
Решение
Вы можете сделать что-то противное, используя SQL, как:
default_scope :select => 'articles.*, (select count(comments.id) from comments where comments.article_id = articles.id) as count_comments'
И тогда у вас будет доступ к Article.First.count_Comments.
Другой (приятный) метод для этого - использовать функцию / опцию «Counter_cache» от принадлежит Ассоциация.
Другие советы
Вы не можете использовать встречный кэш для этого?
belongs_to :article, :counter_cache => true
Вам также необходимо иметь миграцию, которая добавляет колонну Комментарии_Count