Как Ruby on Rails обрабатывает «Выбор количества (*) из группы продуктов по категориям»?

0

Скажите, есть ли таблица с полями

Products
--------
ID
CategoryID
Name
Price
  ... etc

Как Ruby on Rails может предоставить таблицу, которая возвращает

select count(*) from products group by categoryID

чтобы показать, сколько продуктов в каждой категории? Как будет выглядеть результат, в отличие от Products.find(:all), который представляет собой массив объектов Product?

Как более продвинутая операция, как насчет

select count(*) from products p inner join category c on p.categoryID = c.ID 
  group by categoryID

и

select average(price) from products p inner join category c on p.categoryID = c.ID 
  group by categoryID

?

Теги:
aggregate

2 ответа

7

Возможно, вы захотите проверить модуль ActiveRecord::Calculations (я полагаю, он делает большую часть того, что вы просите):

http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html

Некоторые примеры:

Count:

Product.group(:category_id).count

Средний:

Product.joins(:category).group(:category_id).average(:price)

Те, кто надеется, пойдут на правильный путь. Определенно проверяйте связанную документацию, хотя это невероятно полезно.

2

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

$ script/console
Loading development environment (Rails 2.3.8)

>> Product.count
=> 229697

>> Product.count(:group => :category_id)
=> #<OrderedHash {27=>5588, 33=>41, 28=>156, 34=>22, 23=>15209, 1=>115357, 
     29=>109, 24=>68, 2=>14434, 25=>78576, 31=>85, 26=>4, 32=>48}>

Как вы можете видеть, это дает упорядоченное хеш-отображение category_ids для подсчетов для этих категорий.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню