Вы получаете ошибку, потому что topic.first
является массивом. Это потому, что вы звоните Enumerable # first Ha sh (который, как я вижу, возвращает массив, даже если он не задокументирован). проверить это:
export_configs.each do |topic|
topics.each do |t|
p topic
p topic.first
p topic.keys.first # <-- this is the guy, see next
end
end
Вы можете получить свой результат, передав его в массив, не сливаясь с ха sh (это изменит содержание export_configs
:
export_configs.each do |topic|
topics.each do |t|
key = topic.keys.first
if t.include? key
topic[key] << {'url' => t}
end
end
end
Другой вариант Я бы сопоставил URL-адреса с ха sh, просто чтобы быть уверенным, что в других местах нет "foo", "bar", "baz" url (изменяет содержимое export_configs
):
topics_h = topics.map { |url| [url.split('/')[1], url] }.to_h
#=> {"foo"=>"downloads/foo/7s699GToRzf9ViqGU5js/export",
#=> "bar"=>"downloads/bar/o679WbgrcNAJepprCWzR/export",
#=> "baz"=>"downloads/baz/_s5HQWr1xxq5yB7zPPhQ/export"}
Затем l oop через новый га sh:
topics_h.each do |k, v|
export_configs.each do |h|
h[k] << {'url' => v} if h.key? k
end
end
#=> [{"foo"=>[{"state"=>"a"}, {"format"=>"aa"}, {"time"=>120},{"url"=>"downloads/foo/7s699GToRzf9ViqGU5js/export"}]},
#=> {"bar"=>[{"state"=>"b"}, {"format"=>"bb"}, {"time"=>30}, {"url"=>"downloads/bar/o679WbgrcNAJepprCWzR/export"}]},
#=> {"baz"=>[{"state"=>"c"}, {"format"=>"cc"}, {"time"=>5}, {"url"=>"downloads/baz/_s5HQWr1xxq5yB7zPPhQ/export"}]}]