Как получить доступ к вложенному значению, принадлежащему определенному значению - PullRequest
0 голосов
/ 29 июня 2018

У меня проблема с доступом к некоторым данным.

У меня есть этот файл:

SUPPLIERS = [
{ name: "FunePlus", advitam_grade: 3, works: [ { type: "embalming", price: 350 }, {type: "transport_before_casketing", price: 450} ]},
{ name: "FuneTop", works: [ { type: "graving", price: 10 } ]},
{ name: "FuneTruc", advitam_grade: 5, works: [ { type: "embalming", price: 750 }]},
{ name: "FuneCorp", advitam_grade: 2, works: [ { type: "digging", price: 350 }]}
]



class SelectSupplier
  def self.global_grade(name)

  end
end

SelectSupplier.global_grade("FunePlus")

Когда я вызываю метод global_grade, я хочу присоединиться к определенному имени и затем вернуть связанные значения.

Вот вывод, который я ищу:

SelectSupplier.global_grade("FunePlus")
 :advitam_grade=>3, :works=>[{:type=>"embalming", :price=>350}, {:type=>"transport_before_casketing", :price=>450}]}

Кто-нибудь из вас имеет представление о том, как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

@ Джон рассказал вам, как извлечь нужный хеш. Если вы хотите сделать это несколько раз, для разных значений ключа name, вам следует рассмотреть возможность создания единовременного хэша для ускорения поиска.

SUPPLIERS = [
  { name: "FunePlus", advitam_grade: 3, works: [ { type: "embalming", price: 350 }, 
    { type: "transport_before_casketing", price: 450} ]},
  { name: "FuneTop",                    works: [ { type: "graving", price: 10 } ]},
  { name: "FuneTruc", advitam_grade: 5, works: [ { type: "embalming", price: 750 }]},
  { name: "FuneCorp", advitam_grade: 2, works: [ { type: "digging", price: 350 }]}
]

class SelectSupplier
  @supplier_index = SUPPLIERS.each_with_index.with_object({}) { |(g,i),h| h[g[:name]] = i }
  def self.global_grade(name)
    SUPPLIERS[@supplier_index[name]]
  end
end

SelectSupplier.global_grade("FunePlus")
  #=> {:name=>"FunePlus", :advitam_grade=>3, :works=>[{:type=>"embalming", :price=>350},
  #     {:type=>"transport_before_casketing", :price=>450}]}

Хеш @supplier_index равен следующему.

SelectSupplier.instance_variable_get(:@supplier_index)
  #=> {"FunePlus"=>0, "FuneTop"=>1, "FuneTruc"=>2, "FuneCorp"=>3}

Обратите внимание, что я мог бы создать @supplier_index со значениями, равными элементам SUPPLIERS (хэши), но это увеличило бы требования к памяти (что, конечно, не может быть проблемой).

0 голосов
/ 29 июня 2018

Вы можете сделать это, используя Array#find метод:

SUPPLIERS = [
{ name: "FunePlus", advitam_grade: 3, works: [ { type: "embalming", price: 350 }, {type: "transport_before_casketing", price: 450} ]},
{ name: "FuneTop", works: [ { type: "graving", price: 10 } ]},
{ name: "FuneTruc", advitam_grade: 5, works: [ { type: "embalming", price: 750 }]},
{ name: "FuneCorp", advitam_grade: 2, works: [ { type: "digging", price: 350 }]}
]



class SelectSupplier
  def self.global_grade(name)
      SUPPLIERS.find {|x| x[:name] == name }
  end
end

SelectSupplier.global_grade("FunePlus")

Это вернет первый хеш, который соответствует вашему name параметру

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