2010-08-18 3 views
0

J'ai un certain nombre d'enregistrements dans un modèle appelé Kases, chaque enregistrement kase a un statut qui peut être Actif, En attente, Facture Envoyée ou Archivé. J'essaie de trouver comment ajouter un nombre sur le tableau de bord pour le nombre total d'enregistrements kase, le nombre total d'enregistrements kase marqués comme en attente, le nombre total d'enregistrements kase marqués comme facture envoyée et le nombre total d'enregistrements kase marqués comme archivés.Rails sortie nombre d'enregistrements avec X dans le champ?

Actuellement, je mets l'état de l'enregistrement de Kase avec ce qui suit:

<li>Case Status<span><%= f.select "kase_status", ['Active', 'On Hold', 'Archived', 'Invoice Sent'] %></span></li> 

Le kase_status est un champ dans la table Kases et est une chaîne:

t.string :kase_status 

Y at-il un moyen simple de le faire?

Merci,

Danny

EDIT:

Console Message d'erreur:

>> Kases.find(:all).select { |k| k.kase_status == "Active"}.size 
NameError: uninitialized constant Kases 
    from /Library/Ruby/Gems/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:443:in `load_missing_constant' 
    from /Library/Ruby/Gems/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:80:in `const_missing' 
    from /Library/Ruby/Gems/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:92:in `const_missing' 
    from (irb):1 
>> 

Répondre

3

Eh oui!

Mise à jour

les conseils de tout le monde, je mis à jour la réponse. C'est une manière beaucoup plus rapide et plus appropriée d'accomplir ceci.

Contrôleur

@kases_active_count = Kase.count(:conditions => ['kase_status = ?', 'Active']) 
@kases_on_hold_count = Kase.count(:conditions => ['kase_status = ?', 'On Hold']) 
@kases_archived_count = Kase.count(:conditions => ['kase_status = ?', 'Archived']) 
@kases_invoice_sent_count = Kase.count(:conditions => ['kase_status = ?', 'Invoice Sent']) 

HTML

<%= @kases_active_count %> 
+0

Salut, aurait-il besoin d'être comme ça ?: <% - h Kases.find (: all) .select {| k | k.kase_status == "Actif"}. taille%>? – dannymcc

+0

@dannymcc, je voudrais l'ajouter dans votre contrôleur. Comme ci-dessus. Je vais mettre à jour – Trip

+0

Vérifiez que ces commandes fonctionnent bien dans IRB avant de les appliquer. C'est ce que je fais au moins. – Trip

3

Vous pouvez utiliser la méthode de comptage sur Kase, par exemple:

Kase.count(:conditions => ['kase_status = ?', 'Active']) 

Cela signifie que vous venez de faire une requête à c ount le nombre d'objets correspondants plutôt que d'extraire chaque instance Kase de la base de données et de vérifier la valeur.

Si vous souhaitez obtenir toutes les différentes valeurs d'état dans une seule requête que vous pouvez faire:

@all_counts = Kase.find(:all, :group => 'kase_status', :select => 'kase_status, count(*) as how_many) 

qui vous renvoie une collection d'objets Kase-comme avec les attributs kase_status et how_many. Vous pouvez ensuite utiliser cette collection pour afficher tous vos comptes d'état. Par exemple.

<% @all_counts.each do |c| %> 
    <%= c.kase_status %> : <%= c.how_many %> 
<% end %> 
+0

Votre méthode de comptage semble excellente. Quand, le cas échéant, y aurait-il une raison de choisir mon exemple alors quand vous récupérez tous les résultats et les interrogez? – Trip

+0

@Trip La raison principale pour les obtenir tous et les traiter un par un serait si vous comptiez sur un champ dérivé - c'est-à-dire qui ne se trouve pas dans la base de données. Peut-être (exemple irréaliste mais simple) vous pourriez vouloir compter le nombre de Kases inactifs en utilisant une méthode sur Kase 'inactive?' Qui renvoie vrai si le statut est inactif. Je suis très méfiant de trouver toutes les instances d'un modèle si. Je pense que l'essayer avec plus de quelques instances dans votre base de données, vous le trouverez assez lent (bien que vous aurez besoin d'index sur les attributs que vous regroupez par). – Shadwell

Questions connexes