Array.count с блоком не возвращает правильный ответ

У меня есть массив объектов Assignment, которые я создаю из вызова базы данных:

@assignments = @player.assignments 

Я хочу посчитать их следующим:

@assignments.count {|x| x.sets == 0.0}

Это должно подсчитывать количество присвоений с 0,0 наборами. Однако это всегда возвращает общее количество объектов в @assignignments. Я проверил, что

@assignments.each {|x| puts x.sets == 0.0}

не возвращает true во всех случаях. Любые подсказки?

Правкa >

@assignments.map(&:sets)
=> [35.0, 120.0, 0.0, 0.0, 0.0, 0.0, 0.0, 12.0, 75.0, 0.0, 0.0, 0.0, 0.0] 

Ответ 1

Скорее всего, @assignments не является экземпляром Array, а ActiveRecord::Relation, попробуйте @assignments.class. Если это так, метод count работает не так, как вы ожидали, он возвращает количество записей.

Попробуйте

@assignments.where(sets: 0).count

Или даже (сначала преобразовать в массив)

@assignments.to_a.count {|x| x.sets == 0.0}

Ответ 2

Попробуйте следующее:

    @assignments.select {|x| x if x.sets == 0.0}.count

Спасибо

Ответ 3

см. count или каждый просто подсчитывает только количество объектов (внутренне он проверяет каждый объект, как если бы объект присутствовал, он вернет true, если его nill вернет false, поэтому на самом деле он подсчитывает количество true которые возвращаются блоком), если вы хотите посчитать количество раз, когда ваше условие верно, я предлагаю вам попробовать использовать итератор inject, который создан для этих типов вычислений только в рубине.

Это будет как

@assignments.inject(0) {|sum,x| 
  if x.sets == 0.0
    sum + 1
  else
    sum
  end
}