Проблема
В методе DirectionRate#calculate_rate (app/models/gera/direction_rate.rb:139-145) если rate_percent равен nil, то rate_value НЕ устанавливается и остаётся nil:
def calculate_rate
self.base_rate_value = currency_rate.rate_value
raise UnknownExchangeRate, "No exchange_rate for #{ps_from}->#{ps_to}" unless exchange_rate
self.rate_percent = exchange_rate.final_rate_percents
self.rate_value = calculate_finite_rate base_rate_value, rate_percent unless rate_percent.nil?
end
Цепочка возникновения nil
ExchangeRate.value (alias fixed_comission) может быть NULL в БД
- Если
auto_rate? == false, то final_rate_percents возвращает fixed_comission = nil
rate_percent становится nil
- Условие
unless rate_percent.nil? пропускает установку rate_value
rate_value остаётся nil
Последствия
При использовании rate_value в делении возникает ошибка:
ArgumentError: must be initialized with a finite value
Потому что 1.0 / nil или Money.from_amount(1.0 / 0, currency) (Infinity) вызывают исключение.
Связанный PR в Mercury: https://github.com/alfagen/mercury/pull/1673
Связанный issue: https://github.com/alfagen/mercury/issues/1671
Предлагаемое решение
def calculate_rate
self.base_rate_value = currency_rate.rate_value
raise UnknownExchangeRate, "No exchange_rate for #{ps_from}->#{ps_to}" unless exchange_rate
self.rate_percent = exchange_rate.final_rate_percents
self.rate_value = rate_percent.nil? ? 0 : calculate_finite_rate(base_rate_value, rate_percent)
end
Также рекомендуется добавить NOT NULL constraint на колонку gera_exchange_rates.value (alias comission/fixed_comission).
Проблема
В методе
DirectionRate#calculate_rate(app/models/gera/direction_rate.rb:139-145) еслиrate_percentравен nil, тоrate_valueНЕ устанавливается и остаётся nil:Цепочка возникновения nil
ExchangeRate.value(aliasfixed_comission) может быть NULL в БДauto_rate? == false, тоfinal_rate_percentsвозвращаетfixed_comission= nilrate_percentстановится nilunless rate_percent.nil?пропускает установкуrate_valuerate_valueостаётся nilПоследствия
При использовании
rate_valueв делении возникает ошибка:Потому что
1.0 / nilилиMoney.from_amount(1.0 / 0, currency)(Infinity) вызывают исключение.Связанный PR в Mercury: https://github.com/alfagen/mercury/pull/1673
Связанный issue: https://github.com/alfagen/mercury/issues/1671
Предлагаемое решение
Также рекомендуется добавить NOT NULL constraint на колонку
gera_exchange_rates.value(aliascomission/fixed_comission).