Если я ужасно не устала, вам бы сойти с рук что-то вроде этого:
result = Hash.new
a.each do |b, ab|
result[b] ||= Hash.new
ab.each do |c, abc|
abc.each do |d, abcd|
(result[b][d] ||= Hash.new)[c] = abcd
end
end
end
a = result
Теперь я не говорю, что это самый эффективный способ сделать это.