2013-03-07 4 views
12

私は売り手モデルhas_many Itemsを持っています。合計機能でゼロをゼロとして扱う

売り手のすべての商品の合計販売価格を取得したいと考えています。 seller.rbで

は、私はこれが正常に動作します

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

持っている場合販売価格を持っているすべてのアイテム。
まだ販売されていない場合、sale_priceはnilであり、total_item_costは壊れています。

私のアプリでは、sale_priceはゼロまたはゼロのいずれかです。

私のtotal_item_costの方法では、nilの値をゼロとしてどのように扱うことができますか?

+0

方法としてSALE_PRICEを定義し、それは常に0を返すようにするほうがよいのではないでしょうか?私の個人的な好みは、それが属しているsale_priceについての知識を、if sale_price.nil?という形でアプリケーション全体に広がっているからです。 – berkes

+0

これは実際にオークションです - アイテムは0のために「売り」されることができます(誰もそれを望んでいないという意味です)。だから、それはまだオークションされていないことを意味し、ゼロはそれが合格したことを意味します。私はこれを追跡するために他の定義を持っています。 –

答えて

30

一つの方法は次のとおりです。#to_f#to_iなどの

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

方法は0nilをオンにします。

+0

パーフェクト、ありがとう。 –

+0

残念ながら、 ".to_d"(10進)はnilsとクラッシュでは機能しません。価格設定のフロートは、不正確な数式につながります。私は、@ dbenhurの答えと同様に、配列に合計する必要がある列を配置し、コンパイルして(nilsを削除する)合計してしまいました。 – JosephK

1

nil値を拒否します。 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

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

または

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

これは受け入れられる回答である必要があります。 –

+0

優勝者! ;) – Mauro

関連する問題