2011-08-05 53 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和數據兩種命名空間):

{'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 down。

+0

感謝,而不是'字符串',它爲什麼不顯示實際值? – Dejan

+0

這是來自你原來在'case'語句的'else'中有'o.class'的地方。你可以刪除'class'並以'o'結尾。 – tadman

相關問題