2010-12-06 11 views
0

私は{"name" => "golf", "parent" => "sports"}のようなドキュメントをグループと呼ばれるMongoDBのコレクションに取得したいと思いYAML file of groups持っている(トップレベルのグループは、スポーツのように、ちょうどparentなし{"name" => "sports"}だろう。)再帰DFS Rubyのメソッド

我々はあります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