Добавление карты и / или отклонение для уменьшения в представлении рельсов - PullRequest
0 голосов
/ 26 ноября 2018

Я рассчитываю значение 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 голосов
/ 27 ноября 2018

Итак, чтобы убедиться, что ни один из методов, к которым обращаются в блоке Reduce, объекту item не будет возвращать nil, что, следовательно, вызовет ошибку NoMethodError, вы можете сначала проверить их в моментсоздать ваш запрос.A where.not сделает это.Но имейте в виду, что он оставит в стороне каждую запись в базе данных, которая не удовлетворяет критериям запроса.

Для этого тогда:

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

Для этого вы можете проанализироватьопция установки значения по умолчанию для каждого из этих столбцов, так что это поможет вам избежать предыдущего запроса и избавиться от необходимости в каждом случае, когда для них нет значения.Вы можете увидеть документы Rails Migration .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...