Объединить значения 2 хешей в 1, используя Ruby

У меня есть 2 хэша хэшей, которые мне нужно объединить на значениях с помощью Ruby

hoh = Hash.new
hoh = {"bob::params::search_vol_grp"=>{2=>{"search_group_id"=>2, "vol_ids"=>"2,627,628", "num_shards"=>32, "num_replicas"=>1}, 3=>{"search_group_id"=>3, "vol_ids"=>"3,629,630", "num_shards"=>32, "num_replicas"=>1}, 4=>{"search_group_id"=>4, "vol_ids"=>"4,631,632", "num_shards"=>32, "num_replicas"=>1}}
hob = Hash.new
hob = {"bob::params::search_q_broker"=>{2=>{"master_host"=>"hq01p1", "master_port"=>"61616", "slave_host"=>"hq01p2", "slave_port"=>"61616"}, 3=>{"master_host"=>"hq01p1", "master_port"=>"61616", "slave_host"=>"hq01p2", "slave_port"=>"61616"}, 4=>{"master_host"=>"hq01p1", "master_port"=>"61616", "slave_host"=>"hsq01p2", "slave_port"=>"61616"}}

То, что я хотел бы закончить в следующем:

hon = Hash.new
hon = {"bob::params::search"=>{2=>{"master_host"=>"hq01p1", "master_port"=>"61616", "slave_host"=>"hq01p2", "slave_port"=>"61616", "search_group_id"=>2, "vol_ids"=>"2,627,628", "num_shards"=>32, "num_replicas"=>1}, 3=>{"master_host"=>"hq01p1", "master_port"=>"61616", "slave_host"=>"hq01p2", "slave_port"=>"61616", "search_group_id"=>3, "vol_ids"=>"3,629,630", "num_shards"=>32, "num_replicas"=>1}, 4=>{"master_host"=>"hq01p1", "master_port"=>"61616", "slave_host"=>"hq01p2", "slave_port"=>"61616", "search_group_id"=>4, "vol_ids"=>"4,631,632", "num_shards"=>32, "num_replicas"=>1}}

Я пробовал различные попытки использования слияния и слияния! но ни один из них не дал желаемого результата.

Какие-нибудь советы?

РЕДАКТИРОВАТЬ Используя предложение от Ларри, я смог добиться того, что я хотел с помощью следующих

hon = Hash.new
hon['bob::params::search'] = Hash.new
hoh.each do |key,value|
  value.each do |k, v|
    hon['bob::params::search'][k] = hoh['bob::params::search_vol_grp'][k].merge! (hob['bob::params::search_q_broker'][k])
  end
end

Я также обновил 2-й хэш, чтобы использовать fixnum, а не строку, как указано Даршаном.

Спасибо за указатели, ребята!

2 ответа

Решение

Что-то вроде этого...

1[2].merge(2[2])

Вам нужно объединить внутренние хеши.

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

h1 = {2=>{"search_group_id"=>2, "vol_ids"=>"2,627,628", "num_shards"=>32,
          "num_replicas"=>1}}
h2 = {2=>{"master_host"=>"hsrchq01p1", "master_port"=>"61616",
           "slave_host"=>"hsrchq01p2", "slave_port"=>"61616"}}

h1.merge(h2){|key, first, second| first.merge(second)}
# => {2=>{"search_group_id"=>2, "vol_ids"=>"2,627,628", "num_shards"=>32,
#         "num_replicas"=>1, "master_host"=>"hsrchq01p1", "master_port"=>"61616",
#         "slave_host"=>"hsrchq01p2", "slave_port"=>"61616"}}
Другие вопросы по тегам