Aplanar un objeto json anidado

Estoy buscando un método que aplanará un hash "json" en un hash aplanado pero mantendrá la información de la ruta en las teclas aplanadas. Por ejemplo:

h = {"a" => "foo", "b" => [{"c" => "bar", "d" => ["baz"]}]}

aplanar (h) debe devolver:

{"a" => "foo", "b_0_c" => "bar", "b_0_d_0" => "baz"}