2013-03-07 9 views
12

मेरे पास एक विक्रेता मॉडल है जिसमें कई आइटम हैं।शून्य फ़ंक्शन में शून्य के रूप में शून्य का इलाज

मैं किसी विक्रेता के आइटम की कुल बिक्री मूल्य प्राप्त करना चाहता हूं।

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 वापसी बनाने के लिए? यह मेरी निजी वरीयता होगी, क्योंकि यह बिक्री_प्रिसे के बारे में सभी ज्ञान रखता है, जहां यह संबंधित है, 'अगर sales_price.nil' के रूप में पूरे आवेदन में फैलता है? – berkes

+0

यह वास्तव में नीलामी है - एक आइटम 0 के लिए 'बेचा' जा सकता है (जिसका अर्थ है कि कोई भी इसे नहीं चाहता था)। तो नील का मतलब है कि अभी तक नीलामी नहीं की गई है, और शून्य का मतलब है कि यह पारित हो गया है। इस पर नजर रखने के लिए मेरे पास अन्य परिभाषाएं हैं। –

उत्तर

30

एक ही रास्ता है:

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

तरीके #to_f और #to_i तरह 0 में nil हो जाएगा।

+0

बिल्कुल सही, धन्यवाद। –

+0

दुर्भाग्यवश ".to_d" (दशमलव) नाइल्स और क्रैश के साथ काम नहीं करता है। मूल्य निर्धारण के लिए फ़्लोट्स गलत गणित का कारण बन सकता है। मैं कॉलम को एक सरणी में जोड़ने के लिए आवश्यक था, फिर कॉम्पैक्ट (नाइल्स को हटाने के लिए) तो योग, @ dbenhur के उत्तर के समान। – JosephK

1

शून्य मूल्यों को अस्वीकार करें। items.to_a.reject{|x| x.sales_price.nil?}.sum(&:sale_price)

+2

['ऐरे # कॉम्पैक्ट'] (http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-compact) नाइल्स को अस्वीकार करने का एक और संक्षिप्त तरीका है। – dbenhur

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

या

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

यह स्वीकार्य उत्तर होना चाहिए। –

+0

विजेता !! ;) – Mauro

संबंधित मुद्दे