ruby-on-rails - 在 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
可能会起作用。
解决方案
因此,为了确保在 reduce 块中访问的任何方法都不会返回到 item 对象,因此会抛出 NoMethodError,您可以在创建查询时首先检查它们. Awhere.not
会这样做。但请记住,它将保留数据库中不满足查询条件的每条记录。
为此,那么:
where.not(
heritable_sale_price: nil,
product_selections: nil,
purchase_price: nil
)
为此,您可以分析为这些列中的每一个设置默认值的选项,这样可以帮助您避免先前的查询,并且必须在每种情况下都没有价值的情况下进行救援。您可以查看Rails 迁移文档。
推荐阅读
- python - 在 python 中使用 ECB、CBC 和 CFB 模式加密图像时出现错误“IV 没有意义”
- c# - 每次玩家射击子弹时,Unity 编辑器都会冻结
- powershell - powershell 如何从组成员中创建/格式化动态列表以在每个循环中使用
- powershell - 不是编辑器命令:在 Windows 10 上安装新的 Vundle 后的 PluginInstall
- hyperledger-fabric - 获取链码的不同包 ID - Hyperledger Fabric 2.2.0
- r - 使用特定标准在 R 中保留一行并丢弃其他行?
- r - 如何使用 R 通过向量通过迭代或组合构造输入字符串?
- linux-kernel - SMAP/SMEP 是否会阻止用户空间 (kmalloc) 中的分配?
- android - 使用 mActivity = context 在片段 onAttach 中是否存在内存泄漏?
- php - 在 Laravel-8 项目中创建数据不起作用,如何解决?