2013-08-19 74 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想要的 –