FWIW, следующий код должен делать то, что вы просили.Тем не менее, все комментарии о том, что вы делаете неправильно, действительно очень правильны.
Я публикую фрагмент только для образовательных целей.
b = binding
hash =
(?a..?i).map do |key|
[
key.to_sym,
(1..2).map do |i|
[
:"category_#{i}",
{
length: b.local_variable_get(key)["category_#{i}"].length,
amount: b.local_variable_get("category_#{i}_#{key}_total"),
speed: b.local_variable_get("category_#{i}_#{key}_speed")
}
]
end.to_h
]
end.to_h
Код не проверен, но он должен работать "из коробки".