我正在计算一个类别的平均值的ROI值。
<% @categories.each do |category| %>
<h3><strong><%= category.name %><strong></h3>
<% @category_products = category.products_by_warehouse_id(params[:id]) %>
<!-- add map/reject below -->
<%@ROI = (@category_products.reduce(0.0) {|acc, item| acc + (item.heritable_sale_price.to_f * item.product_selections.length) / item.purchase_price.to_f }) %>
<p> Category ROI: <%= number_with_precision((@ROI / @category_products.length.to_f), precision:2) %></p>
.....(close tags)......
缺少财务数据时,该值将引发NaN
。对于单个值,这很好;但是,对于缺少数据的平均值也是如此。
如何在通话中添加map
/ reject
以抛出nil
值,并获得可用值的平均值?
@category_products.length.to_f
也必须跳过该数组中的空元素,以保持总和和长度一致。像.where(purchase_price: [!nil, ""]).size
之类的东西可能有用。
答案 0 :(得分:0)
因此,为了确定,在reduce块中被访问到item对象的方法都不会返回nil,因此将抛出NoMethodError,您可以首先在创建您的查询。 where.not
可以做到这一点。但是请记住,它将保留数据库中不满足查询条件的每条记录。
为此,然后:
where.not(
heritable_sale_price: nil,
product_selections: nil,
purchase_price: nil
)
为此,您可以分析为每个列设置默认值的选项,这样可以帮助您避免上一个查询,并且在每种情况下都没有价值时必须进行挽救。您可以看到Rails Migration docs。