添加地图和/或拒绝以减少Rails视图

时间:2018-11-26 01:47:02

标签: ruby-on-rails ruby oop view

我正在计算一个类别的平均值的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之类的东西可能有用。

1 个答案:

答案 0 :(得分:0)

因此,为了确定,在reduce块中被访问到item对象的方法都不会返回nil,因此将抛出NoMethodError,您可以首先在创建您的查询。 where.not可以做到这一点。但是请记住,它将保留数据库中不满足查询条件的每条记录。

为此,然后:

where.not(
  heritable_sale_price: nil,
  product_selections: nil,
  purchase_price: nil
)

为此,您可以分析为每个列设置默认值的选项,这样可以帮助您避免上一个查询,并且在每种情况下都没有价值时必须进行挽救。您可以看到Rails Migration docs