2013-03-07 19 views
12

Mam model sprzedającego, który ma wiele rzeczy.Traktowanie zero jako zero w sumie funkcji

Chcę uzyskać całkowitą cenę sprzedaży wszystkich przedmiotów Sprzedawcy.

W seller.rb mam

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

Działa to dobrze, jeśli wszystkie elementy mają ceny sprzedaży.
Jeśli jednak nie zostały jeszcze sprzedane, sale_price jest zerowe, a total_item_cost zrywa.

W mojej aplikacji sale_price może być zero lub zero.

W mojej metodzie total_item_cost, jak mogę traktować wartości nil jako zera?

+0

Czy nie byłoby lepiej, aby zdefiniować SALE_PRICE jako metody i sprawiają, że zawsze zwraca 0? Byłoby to moje osobiste preferencje, ponieważ zachowuje całą wiedzę na temat wartości sale_price, gdzie należy, intead rozprzestrzeniania całej aplikacji w postaci 'if sale_price.nil?'. – berkes

+0

To w rzeczywistości aukcja - przedmiot można "sprzedać" za 0 (co oznacza, że ​​nikt go nie chciał). Nil oznacza, że ​​nie została jeszcze sprzedana na aukcji, a zero oznacza, że ​​minęło. Mam inne definicje, aby to śledzić. –

Odpowiedz

30

Jednym ze sposobów jest:

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

Metody takie jak #to_f i #to_i włączy nil w 0.

+0

Doskonale, dzięki. –

+0

Niestety ".to_d" (dziesiętny) nie działa z nils i crashami. Pływaki do wyceny mogą prowadzić do niedokładności matematycznych. Skończyło się na tym, że wstawiłem kolumny, których potrzebowałem, do sumowania w tablicy, a następnie kompaktowanie (w celu usunięcia nil), a następnie sumowanie, podobnie jak w przypadku odpowiedzi @ dbenhur. – JosephK

1

Odrzucić wartości zerowe. 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) to bardziej zwięzły sposób na odrzucenie Nils. – dbenhur

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

lub

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

To powinna być zaakceptowana odpowiedź. –

+0

Zwycięzca !! ;) – Mauro