2010-12-06 4 views
0

나는 (스포츠처럼, 단지 parent없이 {"name" => "sports"} 것이다 최고 수준의 그룹.) {"name" => "golf", "parent" => "sports"} 같은 문서 그룹이라는 MongoDB의 수집에 들어가 내가 좋아하는 것 YAML file of groups재귀 DFS 루비 방법

우리는 traverse the nested hash을 시도했지만 올바르게 작동하는지 확실하지 않습니다. 나는 람다 proc보다 재귀적인 방법을 사용하는 것을 선호한다. 작동하도록 바꾸려면 어떻게해야합니까?

감사합니다. ...

insert_enumerable = lambda {|obj, collection| 
    # obj = {:value => obj} if !obj.kind_of? Enumerable 
    if(obj.kind_of? Array or obj.kind_of? Hash) 
     obj.each do |k, v| 
     v = (v.nil?) ? k : v 
     insert_enumerable.call({:value => v, :parent => obj}, collection) 
     end 
    else 
     obj = {:value => obj} 
    end 
    # collection.insert({name => obj[:value], :parent => obj[:parent]}) 
    pp({name => obj[:value], :parent => obj[:parent]}) 
} 

람다보다는 방법을 사용 :

매트

답변

2

여기 작업 코드입니다 :

require 'mongo' 
require 'yaml' 

conn = Mongo::Connection.new 
db = conn.db("acani") 
interests = db.collection("interests") 
@@interest_id = 0 
interests_hash = YAML::load_file('interests.yml') 

def interests.insert_interest(interest, parent=nil) 
    interest_id = @@interest_id.to_s(36) 
    if interest.is_a? String # base case 
    insert({:_id => interest_id, :n => interest, :p => parent}) 
    @@interest_id += 1 
    else # it's a hash 
    interest = interest.first # get key-value pair in hash 
    interest_name = interest[0] 
    insert({:_id => interest_id, :n => interest_name, :p => parent}) 
    @@interest_id += 1 
    interest[1].each do |i| 
     insert_interest(i, interest_name) 
    end 
    end 
end 

interests.insert_interest interests_hash 

보기 Interests YAML.
acani source을 확인하십시오.

+0

정말 대단합니다. +1 –

0

귀하의 질문이 코드를 변환하는 방법을 그냥? 그렇다면 다음을 입력하십시오.

def insert_enumerable(obj, collection) 
    # obj = {:value => obj} if !obj.kind_of? Enumerable 
    if(obj.kind_of? Array or obj.kind_of? Hash) 
     obj.each do |k, v| 
     v = (v.nil?) ? k : v 
     insert_enumerable({:value => v, :parent => obj}, collection) 
     end 
    else 
     obj = {:value => obj} 
    end 
    # collection.insert({name => obj[:value], :parent => obj[:parent]}) 
    pp({name => obj[:value], :parent => obj[:parent]}) 
end 

귀하가 요구하시는 것이 아닌 경우 명확히하십시오.

+0

감사합니다.하지만 람다가 작동하지 않으므로이를 단지 메서드로 변환해도 핵심적인 문제는 해결되지 않습니다. 내 질문은 그것이 작동하도록하는 방법 (선호 람다 대신에 방법). [내 대답] (http://stackoverflow.com/questions/4368860/recursive-dfs-ruby-method/4524173#4524173)을 참조하십시오. – ma11hew28