8 votes

Comment compter les éléments d'un tableau qui ont une valeur d'attribut spécifique ?

Dans mon application, j'ai un tableau nommé @apps qui est chargé par ActiveRecord avec un enregistrement contenant le nom de l'application, l'environnement, etc.

J'utilise actuellement @apps.count pour obtenir le nombre d'applications dans le tableau, mais j'ai du mal à compter le nombre d'applications dans le tableau où l'option environment = 0 .

Intenté @apps.count(0) mais cela n'a pas fonctionné car il y a plusieurs champs pour chaque enregistrement.

J'ai aussi essayé quelque chose comme @apps.count{ |environment| environment = 0} mais rien ne s'est passé.

Des suggestions ?

22voto

Alex Peachey Points 4466

Il suffit d'utiliser select pour réduire à ce que vous voulez :

@apps.select {|a| a.environment == 0}.count

Cependant, si vous utilisez ActiveRecord, il est préférable de limiter votre requête initiale, à moins que vous n'ayez besoin de tous les enregistrements et que vous ne fassiez que les filtrer de différentes manières à des fins différentes.

Je suppose que votre modèle est l'appel App puisque vous les mettez dans @apps :

App.where(environment: 0).count

5voto

sawa Points 62592

Vous avez la mauvaise variable. De plus, vous avez une affectation au lieu d'une comparaison.

 @apps.count{|app| app.environment == 0}

ou

 @apps.count{|app| app.environment.zero?}

1voto

Blair Anderson Points 587

J'utiliserais reduce O each_with_object ici :

réduire les documents :

@apps.reduce(Hash.new(0)) do |counts, app| 
  counts[app.environment] += 1
  counts
end

docs sur chaque_avec_objet :

@apps.each_with_object(Hash.new(0)) do |app, counts| 
  counts[app.environment] += 1
end

Si vous êtes en mesure d'effectuer une requête, utilisez sql.

App.group(:environment).count retournera un hash avec les clés comme environnement et les valeurs comme compte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X