Идиоматический Ruby для этого - использовать конструктор Hash для отсутствующих ключей:
>> data = Hash.new { |hash, key| hash[key] = {} }
>> data[:a][:b] = {:x => 5}
>> data
=> {:a=>{:b=>{:x=>5}}}
[править] Я не уверен, что он вам нужен здесь, но приведенный выше код работает только для одного вложенного уровня.Для бесконечной вложенности:
class Hash
def self.new_recursive
self.new { |hash, key| hash[key] = self.new_recursive }
end
end
data = Hash.new_recursive
....
Однако я склонен не любить нефункциональные решения, поэтому вы можете посмотреть Enumerable # group_by или какую-то группировку на уровне SQL, Enumerable # inject для создания вложенногохэши.Просто несколько сырых идей, чтобы вы могли немного поиграть.