2010-08-24 5 views
0

Dites s'il y a une table avec des champsComment Ruby on Rails gère-t-il "Select count (*) from products group by category"?

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

Comment Ruby on Rails donner une table qui retourne

select count(*) from products group by categoryID 

qui est de montrer combien de produits dans chaque catégorie? Comment sera le résultat, par opposition à Products.find(:all) qui est un tableau d'objets de produit?

Comme une opération plus avancée, que diriez-vous

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

et

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

?

Répondre

7

Vous pouvez vérifier le module ActiveRecord::Calculations (il fait plus de ce que vous demandez, je crois):

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

Quelques exemples:

comte:

Product.group(:category_id).count 

Moyenne:

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

Celles-ci devraient, espérons-vous sur la bonne voie. Jetez définitivement un coup d'œil sur la documentation liée, car c'est incroyablement utile.

2

Demandez-vous ce qui se passe dans les coulisses ou à quoi ressemblera le résultat? Si c'est le dernier, alors apprenez à aimer la console! Vous pouvez facilement trouver par vous-même:

$ 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}> 

Comme vous pouvez le voir, il vous donne un category_ids de mappage de hachage ordonné aux comptes pour ces catégories.