2013-08-19 42 views
12

我有分配对象的数组,我从一个数据库调用创建:Array.count有块不返回正确的答案

@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] 
+0

使用'select'先'count'。 –

+0

你可以显示'@ assignments.map(&:sets)'的输出吗? –

+0

它适用于我 [1] pry(main)>赋值= [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] => [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] [2] pry(main)> assignments.count {| x | X == 0.0} => 9 [3]撬(主)> assignments.count => 13' –

回答

19

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

尝试

@assignments.where(sets: 0).count 

甚至(转换成数组第一)

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

+1工作。这很可能是一个常见的陷阱...... – tokland

+0

它由Rails ActiveRecord方法返回。但@ assignments.class返回Array。 但是你的解决方案为我工作,所以我猜这是你说的。 非常感谢! – user1742188

+0

@ user1742188:Rails 2?它可能会说“数组”,但它不是一个普通数组。幸运的是,最新版本正在解决无数黑客中的一个。 – tokland

1

尝试使用此:

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

由于

+0

当您想要使用方法返回计数时,此答案适用。意思是,如果你不是基于对象的属性来计算,而是基于方法。例如:'people.select {| person |人,如果person.tall?}。count' – singularity

+0

@singularity'.select().count'与count()'确实相同,只是稍微详细一点。 –

0

看到计数或每只是计数对象的数目仅(内部它检查每个对象仿佛对象将出现它将返回true,如果它的nill将返回false,所以实际上它会计算块返回的true的数量),如果你w蚂蚁来计算你的条件成立的次数,我建议你尝试使用inject迭代器,这种迭代器只在ruby中用于这些类型的计算。

它会像这样

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

[不正确,至少为红宝石计数](http://ruby-doc.org/core-2.0/Array.html#method-i-count) –

+0

@ user1742188你也可以试试这个。 – dirtydexter

+0

在这种情况下,您应该相应地编辑您的答案,因为正如我所说的,默认的'count'完全按照OP想要的 –