2013-07-14 16 views
5

Nella mia applicazione, ho un array chiamato @apps che viene caricato da ActiveRecord con un record che contiene il nome dell'applicazione, l'ambiente, eccCome posso contare gli elementi in una matrice che hanno un valore di attributo specifico?

Attualmente sto usando @apps.count per ottenere il numero di applicazioni nella matrice, ma io sto avendo problemi a contare il numero di applicazioni nella matrice in cui il environment = 0.

Ho provato @apps.count(0) ma ciò non ha funzionato poiché ci sono più campi per ogni record.

Ho anche provato qualcosa come @apps.count{ |environment| environment = 0} ma non è successo niente.

Qualche suggerimento?

risposta

12

Basta usare select per limitare a ciò che si vuole:

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

Tuttavia, se questo si basa su ActiveRecord, si sarebbe meglio solo fare la vostra query iniziale si limita a meno che naturalmente bisogno di tutto dei record e li stanno semplicemente filtrando in modi diversi per scopi diversi.

darò per scontato il vostro modello è chiamata App dal momento che li sta mettendo in @apps:

App.where(environment: 0).count 
+0

Vado con la prima soluzione perché ho bisogno di tutti i record. – ny95

+3

A seconda del numero di record, può essere più veloce chiedere al DBM di contare i record, quindi iterare un record alla volta, piuttosto che chiedere tutti i record, quindi contare e scorrere su di essi in Ruby. Il DBM è ottimizzato per passare un "conteggio" e poi iterare fila per fila. Il dumping di un'intera tabella in una sola volta supererà il DB, l'host DB, la rete, l'host su cui viene eseguito il codice e il server e l'app Rails. –

4

Hai sbagliato variabile. Inoltre, hai un incarico anziché un confronto.

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

o

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

Sembra che restituisca sempre '@ apps.count' se è' true' o 'false'. Ad esempio, '@ apps.count {| app | false} == @ apps.count {| app | true} ' – Trip

0

userei reduce O each_with_object qui:

reduce docs:

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

each_with_object docs:

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

Se si è in grado di interrogare, utilizzare SQL

App.group(:environment).count restituirà un hash con chiavi come l'ambiente e valori come il conteggio.

Problemi correlati