2014-01-27 21 views
3

有模型Order with association OrderItem。我需要計算訂單的成本,我用它下面的代碼:如何使用注入來獲得一些AR收集的總和?

order_items.inject{ |sum, oi| sum += oi.value } 

但作爲結果我得到OrderItem的對象,而不是Fixnum對象或別的東西。我錯了什麼?

+1

值爲一個Integer或Float或Bignum,那麼你應該使用ActiveRecord ['SUM'](http://apidock.com/ rails/ActiveRecord/Calculations/ClassMethods/sum) – bjhaid

回答

6

除非您將初始值傳遞至Enumerable#inject,否則將使用該集合的第一項(您的情況爲OrderItem)。根據你的問題,OrderItem += OrderItem#value會返回OrderItem。

試試下面的(明確地傳遞初始值作爲Fixnum對象0):

order_items.inject(0) { |sum, oi| sum + oi.value } 

由於bjhaid評論說,這是更好地使用,如果你處理的ActiveRecord的ActiveRecord sum method。 (不需要獲取記錄)

OrderItem.sum('value') 
+0

最好使用活動記錄查詢界面來計算總和而不是'inject' – bjhaid

+0

@bjhaid,謝謝你的評論。我會補充一點。我只是想解釋當他/她使用'inject'時,OP爲什麼得到'OrderItem'而不是'Fixnum'的原因。 – falsetru

+0

我剛剛檢查了+ =沒有什麼區別,如果它正在處理的'Fixnum'對象例如'(1..6).inject {| mem,var | mem = = var}#=> 21' – bjhaid