Получить значения из вложенного хэша - PullRequest
1 голос
/ 28 мая 2019

У меня есть этот хэш, который я использую для хранения значений, и если значения не найдены, чтобы получить значения по умолчанию:

AMOUNT = {
  EUR: {
    eps:         { AT: 1_00 },
    safetypay:   { PE: 15_000_00, CR: 5_000_00, BE: 15_000_00, },
    przelewy24:  5_00,
    qiwi:        5_00,
    bcmc:        { AT: 1_00, BE: 1_00 },
    giropay:     { DE: 1_00 },
    ideal:       { NL: 1_00 },
    mybank:      { IT: 1_00, FR: 1_00 },
  },
  CZK: {
    trustpay:   { CZ: 20_00 }
  }
}.with_indifferent_access

Я хотел бы получить значения, основанные на ключах, поэтому я попробовал это:

def amount_for(payment_type, country, currency)
  payment_amount = AMOUNT.dig(currency, payment_type, country) if payment_type.is_a?(Hash)
  payment_amount ||= AMOUNT.dig(currency, payment_type)
  payment_amount ||= 1
end

Но я получаю за результат не число, а {"AT"=>100, "BE"=>100}. Если я уберу чек if payment_type.is_a?(Hash), я получу исключение Integer does not have #dig method (RuntimeError)

Вы знаете, как я могу решить эту проблему?

1 Ответ

1 голос
/ 28 мая 2019

payment_type будет, например, "AT" - это аргумент, который вы передаете в свою функцию, он никогда не будет хешем.

Эта перезапись должна делать то, что вы хотите:

def amount_for(payment_type, country = nil, currency = nil)
  path = [payment_type, country, currency].compact
  obj = AMOUNT
  obj = obj[path.shift] while Hash === obj && !path.empty?
  return obj || 1
end

С другой стороны, это довольно похоже на код, который вы написали:

def amount_for(payment_type, country = nil, currency = nil)
  tmp = AMOUNT.dig(payment_type, country, currency)
  return tmp if tmp
  tmp = AMOUNT.dig(payment_type, country)
  return tmp if tmp
  tmp = AMOUNT.dig(payment_type)
  return tmp if tmp
  return 1
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...