2015-02-26 4 views
0

У меня есть модель под названием Project, которая может содержать любое количество детей, а дети (дети) могут иметь любое количество детей. В основном я использую gem https://github.com/collectiveidea/awesome_nested_set, чтобы достичь этого (структура дерева) Я хочу построить хеш, как hash[child.id] = child.name в порядке родительства. Для примера. У меня есть 3 проекта (1,2,3), проект № 2 является дочерним по проекту № 1, проект №3 и проект №1 являются корнями. В результате я хочу хэш, который будет выглядеть как {1=> name1, 2=> name2, 3=> name3}Построить хэш из древовидной структуры

Я знаю, это должно быть сделано рекурсивно, но я застрял с помощью следующего кода

def self.build_tree_of_projects(project) 
    hash = {} 
    project.children.each do |child| 
     hash[child.id] = "#{'  ' * child.level + '»' + ' '}#{child.try(:name)}" 
     next unless child.children.present? 
     hash.merge(self.build_tree_of_projects(child)) if child.children.present? 
    end 
    hash 
    end 

Это просто возвращает меня хэш с 1 парой, когда должно быть ~ 5. Что я делаю не так?

ответ

1

Похоже, hash.mergedoes not change the hash in-place. Замените ваш звонок на hash.merge с вызовом hash.merge!, и он должен работать.

+0

черт возьми, точно, пропустил это. Спасибо – Avdept

+0

'hash.merge!' Aka 'hash.update'. –

Смежные вопросы