首页 > 解决方案 > 在 rails 视图中添加 map 和/或拒绝到 reduce

问题描述

我正在计算一个类别的平均投资回报率值。

<% @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可能会起作用。

标签: ruby-on-railsrubyoopview

解决方案


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

为此,那么:

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

为此,您可以分析为这些列中的每一个设置默认值的选项,这样可以帮助您避免先前的查询,并且必须在每种情况下都没有价值的情况下进行救援。您可以查看Rails 迁移文档


推荐阅读