Рельсы Арель, считая стоимость включения? - PullRequest
1 голос
/ 29 мая 2011

Я в основном привык писать простой sql для вещей, но я бы хотел лучше понять.В основном, что я могу сделать, чтобы посчитать содержимое: include.

Category.includes(:discussions)

Это мои комментарии затем обсуждения has_many.Мне нужно знать, как считать комментарии модели категории.

Извините, если это очевидно, и заранее благодарю за любую помощь!

Редактировать: Обновлено для учета категории, а не обсуждения.

Ответы [ 2 ]

1 голос
/ 29 мая 2011

Я далеко не эксперт по арелам, но мой инстинкт в том, что вы должны получить хотя бы немного руководства в своих расчетах.Вот как вы можете получить количество для каждой категории, максимально используя arel:

Category.joins(:discussions => :comments).group('categories.id').select('categories.id, COUNT(*) as cnt')

Обратите внимание, что у вас не будет полной модели для загруженных категорий, но я думаю, что это самый быстрый способ получитьполный список пунктов.Я не уверен, какие другие подходы вы могли бы использовать с arel, но я думаю, что это самый быстрый запрос.В зависимости от вашего конкретного приложения, вы можете сделать что-то немного по-другому.

0 голосов
/ 29 мая 2011

Как правило, вы можете использовать метод #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?

...