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

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

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

?

Ответы [ 2 ]

7 голосов
/ 24 августа 2010

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

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

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

Количество:

Product.group(:category_id).count

Средняя:

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

Надеемся, что это поможет вам выбрать правильный путь. Обязательно ознакомьтесь со связанной документацией, поскольку она невероятно полезна.

2 голосов
/ 24 августа 2010

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

$ 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 с подсчетами для этих категорий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...