Реализация общего метода ruby ​​для извлечения данных из хэша данных Nosql - PullRequest
0 голосов
/ 12 февраля 2019

Как получить конкретное значение из хэша хэша, используя пользовательскую реализацию ruby ​​

У меня есть данные nosql, которые выходят в этом конкретном формате:

{:bookname=>"The Fight for Guadalcanal", 
:sourceSystemId=>"d4ba4799-atil45-4a", 
:checkouttimestamp=>"2018-12-12T04:38:34.476796700Z",:firedevents=>[{:operation=>"GET", :entity=>"warbooks", :keys=>[{:name=>"book_guid", :value=>{:FieldString=>"e33almmatter-syslibrary"}}], 
 :attributes=>[{:libLocation=>"a44364", :value=>{:FieldInteger=>3994}}, {:name=>"big_response", :value=>{:FieldString=>"The Battle for Enderson Field, also"}}],
 :customizable=>true}]}

Есть ли вметод в ruby, предоставляющий ключ в качестве параметра аргумента?

Я знаю, что в ruby ​​есть метод fetch, который возвращает мне значение:

test.fetch(:firedevents,()).fetch(:operation))

это возвращает мне значение GET

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

например: ruby_mthod(sourceSystemId.to_sym) должен достать меня d4ba4799-atil45-4a

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Вы можете пройти через хеш рекурсивно как:

def deep_find(key, object=self, found=nil)
    if object.respond_to?(:key?) && object.key?(key)
      return object[key]
    elsif object.is_a? Enumerable
      object.find { |*a| found = deep_find(key, a.last) }
      return found
    end
  end

или вы можете использовать deep_find из hashie gem

0 голосов
/ 12 февраля 2019

Выборки будет достаточно, чтобы получить sourceSystemId (при условии, что ваши данные в h):

> h.fetch(:sourceSystemId)
# => "d4ba4799-atil45-4a"

Если вы ищете что-то более общее, взгляните на Hash#dig.Это позволяет аккуратно связать хеш-доступ:

> h.fetch(:firedevents).first.fetch(:keys).first.dig(:value, :FieldString)
# => "e33almmatter-syslibrary"

РЕДАКТИРОВАТЬ:

Как и предположил @Stefan, #dig можно использовать для всей операции:

> h.dig(:firedevents, 0, :keys, 0, :value, :FieldString)
# => "e33almmatter-syslibrary"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...