2010-01-07 6 views
37

Je sais que j'ai déjà vu ça mais je ne trouve rien maintenant. Je veux regrouper une requête par une certaine colonne et être capable d'afficher combien sont dans chaque groupe. Je suis la première partie vers le bas:Group and count in Rails

@line_items = @project.line_items.all(:group => "device_id") 

Ceci est pour mon index poste vue, qui est juste une table affichant les postes. Comment puis-je créer une colonne dans cette table pour "count" maintenant que les éléments de campagne sont regroupés par périphérique?

Répondre

75

Vous pouvez faire count sur line_items qui vous renverra un hash ordonné de device_id et count.

@project.line_items.group(:device_id).count 
+1

Ceci donne un avertissement: 'DEPRECATION WARNING: Relation # calculer avec les options finder est obsolète. S'il vous plaît, construisez une portée, puis appelez-la à la place. (appelé à partir de C: dans 'count' :) ' – Chloe

+6

@Chloe - Essayez ceci dans Rails 4 pour supprimer l'avertissement:' @ project.line_items.group (: device_id) .count' –

8

il suffit d'ajouter une option :select:

@line_items = @project.line_items.all(
    :group => "device_id", 
    :select => "device_id, COUNT(*) as count" 
) 

Ensuite, chaque @line_item aura un attribut count.

+0

HRM, je mets debug (@line_items) à mon avis, mais je ne vois pas de compte, donc je n » Je pense que je te comprends. Je pense que la sortie est exactement la même que sans l'option de sélection. – tladuke

+0

cela fonctionne réellement, mais pas si vous avez: include – tladuke

+0

La méthode de débogage n'affichera pas le nombre car ce n'est pas un attribut ActiveRecord, mais il y a * un * attribut count sur chaque objet. En tout cas, la solution de Chandra est bien meilleure. –

10

hachage devise_id sous forme d'enregistrements clés et associés comptent

@project.line_items.group(:devise_id).count 
3

quelque chose comme

User.all(:joins => :comments, :select => "users.*, count(comments.id) as comments_count", :group => "users.id") 

pourrait également travailler ...

0

Pour seulement compter plumer serait plus rapide ici plutôt que groupe

@project.line_items.pluck(:device_id).count 


@project.line_items.pluck(:device_id).uniq.count 
+0

Ils vont retourner des résultats complètement différents pour les attributs énumérés . Par exemple: 'customer_subscriptions.group (: Statut) .count' retournera: ' {1 => 6, 2 => 11, 3 => 136, 0 => 30} '' et customer_subscriptions. pluck (: status) .count' va juste retourner '183' – msdundar

+0

true, qu'en est-il de uniq alors? @ project.line_items.pluck (: device_id) .uniq.count –

0

Je pense que vous pouvez essayer ainsi que.

@project.line_items.group(:device_id).pluck("device_id, count(device_id)") 

^^ Cela donne tableau de tableaux avec de la device_id et count 'éléments