#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