Подсчет количества ассоциаций между несколькими объектами Rails

#ruby-on-rails

#ruby-on-rails

Вопрос:

 class Article
  has_many :comments
end

class Comment
  belongs_to :article
end
  

Я хотел бы иметь возможность определить, сколько всего комментариев существует для определенных статей. Например: статьи # 20, # 21 и # 22 содержат в общей сложности X комментариев между ними.

Любые указатели были бы великолепны!

Ответ №1:

Я предлагаю следующее:

 Comment.where(:article_id => [20, 21, 22]).count
  

Выполнение подсчета и т. Д. В базе данных и всего в одном запросе (который в данном случае будет ActiveRecord) является максимально эффективным.

Комментарии:

1. 1 за то, что вы подумали о проблеме наоборот. Однако в некоторых случаях вы можете не знать идентификаторы статей перед запросом, отличные от приведенного, например Article.where(["created_at > ?",2.weeks.ago]) .

2. В случае, когда вы указали, я бы сказал, что пришло время использовать соединение, например Comment.joins(:article).where('articles.created_at > ?', 2.weeks.ago).count

Ответ №2:

Вы можете добавить a counter_cache в свою articles таблицу

 class Article
  has_many :comments, :counter_cache => true
end
  

и добавьте comments_count столбец в свою articles таблицу.

(http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html ), а затем суммируйте его следующим образом.

Article.where(:id => [20,21,22]).sum(:comments_count)

Ответ №3:

Вы можете легко сделать это без кэша счетчиков, если хотите.

 Article.where(:id => [20,21,22]).joins(:comments).count