2016-04-21 51 views
0

在我的理解中,下面的ruby表達式應該產生相同的結果。
顯然我失去了一些東西,這是一個太嚴重的錯誤被忽視......以上在Ruby中計數數組元素(count()函數的意外結果)

# returns the number of ALL elements in the array 
count = @quotation.quotation_items.count { |x| x.placement == current_placement} 

# Does what I expect 
count = (@quotation.quotation_items.find_all { |x| x.placement == current_placement }).length 

quotation_items是一個ActiveRecord has_many協會

回答

2

#COUNT不採取這樣一個塊。

如果你想在一個計數使用情況,你會怎麼做:

@quotation.quotation_items.count(:conditions => "placement = #{current_placement}") 

http://apidock.com/rails/ActiveRecord/Calculations/ClassMethods/count

+0

我以爲ActiveRecords協會實現Enumerable協議... –

+1

它是CollectionAssociation方法,而不是計算(請參見鏈接) – Ilya

+0

ActiveRecord計數總是觸發一個SELECT COUNT(...)上的數據庫 - 它是不一樣的Enumerable#count – mccalljt

0

你#COUNT的使用是不正確。

我相信它不接受一個塊。我不確定它爲什麼沒有返回錯誤。

你可以使用這樣的:如果你使用的ActiveRecord

count = @quotation.quotation_items.map{ |x| x.placement == current_placement}.count(true)

1

你需要記住,有在那裏的編譯的查詢條件和條款和一個點,一個點你有一個結果集。某些事情只能在一種模式或另一種模式下工作,儘管它試圖使事情保持一致,無論如何。

在你的情況下,你期望count像Enumerable一樣工作,但這仍然是一個數據庫級別的操作符。

爲了解決這個問題:

@quotation.quotation_items.where(placement: current_placement).count 

對構成該只計算你需要的東西一個查詢,東西逼近:

SELECT COUNT(*) FROM quotation_items WHERE quotation_id=? AND placement=? 

在這個時候,產生一個單號,是不是選擇相當大的不同每個記錄,實例化爲模型,然後使用Enumerable對這些記錄進行計數。