Как правило, вы можете использовать метод #count
в любой ассоциации has_many
, чтобы получить счет. Например:
Category.find(1, :include => :discussions).discussions.first.comments.count
Edit:
Подход "грубой силы" для подсчета всех комментариев к определенной категории:
category = Category.find(1, :include => { :discussions => :comments }) # Check that this eager loading doesn't cause unnecessary overhead.
count = 0
category.discussions.map{|d| count += d.comments.count}
Обратите внимание, что это создаст N + 1 запросов и, следовательно, может не быть опцией производительности. Альтернативой является установка столбца кеш счетчика в модели обсуждения, а затем сделать это вместо этого:
category = Category.find(1, :include => :discussions)
count = 0
category.discussions.map{|d| count += d.comments_count}
Редактировать (2):
Вы можете дополнительно упростить бит суммирования, используя метод Array#inject
. Смотрите пример здесь: Как суммировать массив чисел в Ruby?