2013-07-14 10 views
5

W mojej aplikacji, mam tablicę o nazwie @apps który jest ładowany przez ActiveRecord z rekordu zawierającego aplikacji nazwisko, środowisko itdJak liczyć elementy w tablicy, które mają określoną wartość atrybutu?

Obecnie używam @apps.count aby uzyskać liczbę aplikacji w tablicy, ale Mam problem z liczeniem liczby aplikacji w tablicy, gdzie environment = 0.

Próbowałem @apps.count(0), ale to nie zadziałało, ponieważ istnieje wiele pól dla każdego rekordu.

Próbowałem także coś w rodzaju @apps.count{ |environment| environment = 0}, ale nic się nie stało.

Wszelkie sugestie?

Odpowiedz

12

Wystarczy użyć select celu zawężenia co chcesz:

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

Jednakże, jeśli ten jest oparty na ActiveRecord, byłbyś lepiej tylko co swoje początkowe zapytanie ograniczają go o ile oczywiście trzeba wszystko rekordów i filtruje je na różne sposoby w różnych celach.

będę zakładać model jest wywołanie App ponieważ jesteś umieszczając je w @apps:

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

Wybieram pierwsze rozwiązanie, ponieważ potrzebuję wszystkich rekordów. – ny95

+3

W zależności od liczby rekordów, może być szybciej, gdy poprosimy DBM o policzenie rekordów, a następnie iterowanie po jednym rekordzie, niż żądanie wszystkich rekordów, a następnie zliczanie i iterowanie po nich w Ruby. DBM jest zoptymalizowany do przekazywania 'count', a następnie iterowania rząd po rzędzie. Zrzucenie całego stołu na raz pobije twoje DB, hosta DB, sieć, host, na którym działa Twój kod, oraz twój serwer i aplikację Rails. –

4

mieć zmienną źle. Ponadto masz przypisanie zamiast porównania.

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

lub

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

Wydaje się, że zawsze zwraca '@ apps.count', czy jest to' true' czy 'false'. Na przykład '@ apps.count {| app | false} == @ apps.count {| app | true} ' – Trip

0

Chciałbym użyć reduce LUB each_with_object tutaj:

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 

Jeśli jesteś w stanie do kwerendy, należy użyć SQL

App.group(:environment).count powróci hash z kluczami jak ochrona środowiska i wartości jako liczby.

Powiązane problemy