2013-03-07 179 views
12

我有一個賣方型號has_many項目。零作爲零處理零功能

我想獲得賣家所有物品的總銷售價格。

在seller.rb我

def total_item_cost 
    items.to_a.sum(&:sale_price) 
end 

這工作正常,如果所有的銷售價格的項目。
但是,如果尚未銷售,sale_price爲零,並且total_item_cost中斷。

在我的應用程序中,sale_price可以是零或零。

在我的total_item_cost方法中,如何將nil的值視爲零?

+0

這豈不是更好地界定SALE_PRICE爲手段,使其始終返回0?這將是我個人的偏好,因爲它保留了它所屬的sale_price的所有知識,並以'if sale_price.nil?'的形式傳播到整個應用程序中。 – berkes 2013-03-07 16:50:31

+0

它實際上是一個拍賣 - 一個物品可以被'出售'爲0(意思是沒有人想要它)。所以零表示它還沒有被拍賣,而零表示它通過了。我有其他的定義來跟蹤這個。 – 2013-03-07 16:56:12

回答

30

一種方法是:

items.to_a.sum { |e| e.sale_price.to_i } # or to_f, whatever you are using 

方法,如#to_f#to_i會變成nil0

+0

完美,謝謝。 – 2013-03-07 16:58:43

+0

不幸的是,「.to_d」(十進制)不適用於nils和崩潰。浮動價格可能會導致數學不準確。我最終把我需要的列放入一個數組中,然後緊湊(刪除nils)然後求和,類似於@ dbenhur的答案。 – JosephK 2017-03-06 08:50:46

1

拒絕零值。 items.to_a.reject{|x| x.sales_price.nil?}.sum(&:sale_price)

+2

['Array#compact'](http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-compact)是一種更簡潔的拒絕nils的方式。 – dbenhur 2013-03-07 17:07:28

35
items.map(&:sale_price).compact.sum 

items.map(&:sale_price).sum(&:to_i) 
+6

這應該是被接受的答案。 – 2016-06-20 14:54:43

+0

獲勝者! ;) – Mauro 2017-11-29 13:22:12