Обработка nil как функции нуля в сумме для атрибута, полученного из метода (Rails 4.2) - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть таблица, в которой цены аренды продукта в таблице указаны как number_to_currency(product.heritable_rental_price.to_f * product.quantity.to_f), из модели продукта, где процент получен из значения по умолчанию и рабочего значения, доступного для этого продукта:

def heritable_rental_price
    if rental_price.present?
      return rental_price
    elsif working_value.present?
      return (working_value || 0.0) * heritable_rental_price_percentage / 100
    else  
      return nil
    end
  end

Я использую Обрабатываю ноль как функцию нуля в сумме как модель для решения этой проблемы.

def rental_price_sum
 self.map(&:heritable_rental_price).compact.sum
end   

Вот как это выглядит в представлении:

<tr>
<td>
 <% if product.heritable_rental_price.present? %>
  <%= number_to_currency(product.heritable_rental_price.to_f * product.quantity.to_f) %>
 <% else %>  
   --- 
 <%end%>
</td>
<td>
</tr>
<tr>
 <td>
  <% if product.heritable_rental_price.present? %>
    <%= number_to_currency((product.rental_price_sum.to_f * product.quantity.to_f).reduce(0, :+)) %>
  <% else %>  
    --- 
  <%end%>
</td>
</tr>

Что касается вещей, которые я тоже пробовал, я смог вывести сумму предварительно определенного :working_value, добавив .sum [: working_value] в конец, но пока не этот, пока (так как это определено в модели, я не могу вытащить его на Sym)

Total Working Value: <%=number_to_currency(category.products_by_warehouse_id(params[:id]).sum(:working_value)) %>

1 Ответ

0 голосов
/ 08 ноября 2018

Сначала я бы указал:

elsif working_value.present?
      return (working_value || 0.0) * heritable_rental_price_percentage / 100

Если working_value.present? working_value не может быть nil, поэтому || 0.0 никогда не будет работать.

И если это так, то ноль умноженное на что-либо, деленное на что-либо, все равно равно нулю.

So

def heritable_rental_price
  return rental_price if rental_price.present?
  return 0 unless working_value.present?  
  working_value * heritable_rental_price_percentage / 100
end

Тем не менее, я думаю, что основная проблема в том, что вы предполагаете, что 0.present? возвращает false, тогда как на самом деле он возвращает true. Я думаю, что вы хотите чек unless product.heritable_rental_price.nil?

Также должно return rental_price if rental_price.present? быть return rental_price unless rental_price.nil? (если rental_price по умолчанию равно нулю)

...