17

我有一组通过数据库调用创建的 Assignment 对象:

@assignments = @player.assignments 

我想用这个来计算它们:

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

这应该计算 0.0 组的作业数。但是,这总是返回 @assignments 中的对象总数。我已经检查过了

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

并非在所有情况下都返回 true。有什么线索吗?

编辑>

@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] 
4

3 回答 3

26

最有可能的@assignments是,不是Array实例,而是ActiveRecord::Relation,尝试@assignments.class。如果是这样,count则方法无法按预期工作,它会返回记录数。

尝试

@assignments.where(sets: 0).count

甚至(先转换为数组)

@assignments.to_a.count {|x| x.sets == 0.0}
于 2013-08-19T08:39:21.377 回答
2

试试这个:

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

谢谢

于 2013-08-19T08:30:52.537 回答
0

查看 count 或 each 仅计算对象的数量(在内部,它检查每个对象,好像对象将存在,如果它nill返回 false,它将返回 true,因此实际上它计算true块返回的数量),如果你想计算你的条件成立的次数我建议你尝试使用inject仅在 ruby​​ 中为这些类型的计算制作的迭代器。

会是这样

@assignments.inject(0) {|sum,x| 
  if x.sets == 0.0
    sum + 1
  else
    sum
  end
}
于 2013-08-19T08:31:46.723 回答