2011-08-05 17 views
1

ハッシュのレベルを調べ、そのレベルのすべての要素に名前空間を適用する必要がある状況です。Ruby:名前空間をハッシュに接頭する方法

これはシナリオです:

  1. 私は私のデータが移入されたオブジェクトを持っています。

  2. 次の例では、オブジェクトをハッシュに変換します。

    #convert Object to Hash 
    def my_hash 
        Hash[instance_variables.map { |var| [var[1..-1].to_sym, instance_variable_get(var)] }] 
    end 
    
  3. 最後に、私はハッシュスルーループしたいと私のネストされたハッシュに別の名前空間を適用します。私は各要素を検査し、分類方法では、ネストされたレベルを再帰的に検索します

    soap.body = request_object.my_hash 
    
    • は、残念ながら、私は直接サボン宝石でこれを行うには良い解決策を見つけることができませんでした:

      def classify(o) 
          case o 
          when Hash 
           #Need to refactor this to prefix :data NS for nested hash, overwriting the default :mes NS. 
           h = {} 
           o.each {|k,v| h[k] = classify(v)} 
           h     
          else 
           o.class 
          end 
      end 
      soap.body = classify(request_object.my_hash) 
      
(これは、いくつかのより多くの魔法が必要です)

それは次のようになります、元のハッシュ:

{:UserTicket=>'123',:ImpersonationUsername=>'dave',:TicketSettings=>{:ResourceId=>'abcd',:ClientIp=>'0',:Username=>'bobby'}} 

出力(MES、データは2つのネームスペースである):

{'mes:UserTicket'=>'123','mes:ImpersonationUsername'=>'dave','mes:TicketSettings'=>{'data:ResourceId'=>'abcd','data:ClientIp'=>'0','data:Username'=>'bobby'}} 

答えて

0

は、ここでは、関連付けられた識別子のリストを渡したアプローチですネストの各レベル:

def classify(o, with) 
    case o 
    when Hash 
     h = {} 
     o.each {|k,v| h[:"#{with[0]}:#{k}"] = classify(v, with[1, with.length])} 
     h     
    else 
     o.class 
    end 
end 

hash = {:UserTicket=>'123',:ImpersonationUsername=>'dave',:TicketSettings=>{:ResourceId=>'abcd',:ClientIp=>'0',:Username=>'bobby'}} 

classify(hash, [ :mes, :data ]) 
# => {"mes:UserTicket"=>String, "mes:ImpersonationUsername"=>String, "mes:TicketSettings"=>{"data:ResourceId"=>String, "data:ClientIp"=>String, "data:Username"=>String}} 

あなたは再帰的なアルゴリズムを使用している場合、あなたはdの各レベルで適用されているものの範囲を修正する機会を持っていますigダウン。

+0

「String」の代わりに、実際の値が表示されないのはなぜですか? – Dejan

+0

これは 'case'ステートメントの' else'に 'o.class'がある元のものです。 'class'を削除して' o'で終わることができます。 – tadman

関連する問題