2013-07-14 2 views
5

В моем приложении, я массив с именем @apps который загружается по ActiveRecord с записью, содержащая имя приложения, окружающей среды и т.д.Как подсчитать элементы в массиве с определенным значением атрибута?

настоящее время я использую @apps.count, чтобы получить количество приложений в массиве, но я У меня проблемы с подсчетом количества приложений в массиве, где environment = 0.

Я пробовал @apps.count(0), но это не сработало, так как для каждой записи есть несколько полей.

Я также пробовал что-то вроде @apps.count{ |environment| environment = 0}, но ничего не произошло.

Любые предложения?

ответ

12

Просто используйте select, чтобы сузить то, что вы хотите:

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

Однако, если это основано на ActiveRecord, вы бы лучше просто сделать ваш первоначальный запрос ограничить его, если, конечно, вам не нужны все записей и просто фильтруют их по-разному для разных целей.

Я предполагаю, ваша модель вызова App, так как вы помещаете их в @apps:

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

Я собираюсь с первым решением, потому что мне нужны все записи. – ny95

+3

В зависимости от количества записей может быть быстрее запросить DBM подсчет записей, а затем повторить одну запись за раз, чем запросить все записи, а затем пересчитать и перебрать их в Ruby. DBM оптимизирован для передачи 'count', а затем итерации по строкам. Сбрасывая всю таблицу сразу, вы будете бить свою БД, хост БД, сеть, хост, на котором работает ваш код, и ваш сервер и приложение Rails. –

4

Вы переменную неправильно. Кроме того, у вас есть назначение вместо сравнения.

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

или

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

Кажется, всегда возвращается '@ apps.count' ли его' истина' или 'ложь'. Например, '@ apps.count {| app | false} == @ apps.count {| приложение | правда} ' – Trip

0

Я хотел бы использовать reduce ИЛИ each_with_object здесь:

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 

Если вы можете запросить, использовать SQL

App.group(:environment).count возвращает хэш с ключами, как окружающая среда и ценности, как кол.

Смежные вопросы