2012-05-01 11 views
1

これを多次元にするにはどうすればよいですか?各検索結果エントリには複数の属性:attributes => ['sAMAccountName','givenName','SN','mail']があります。結果には多くのエントリが存在する可能性があります。このコードは、複数の属性を持つエントリを1つだけ作成するのに適しています。Ruby - 多次元ハッシュ

def self.Find(attribute, loginID) 
     conn = Net::LDAP.new :host => SERVER, 
          :port => PORT, 
          :base => BASE, 
          :auth => { 
             :username => 'admin', 
             :password => 'admin', 
             :method => :simple 
             } 
     if conn.bind 
      result = HashWithIndifferentAccess.new 
      conn.search(:base => LDAPBASE, 
         :filter => Net::LDAP::Filter.eq(attribute, loginID+"*"), 
         :attributes => ['sAMAccountName','givenName','SN','mail'], 
         :return_result => true 
        ).each do |entries| 
         entries.each do |attribute, values| 
          values.each do |value| 
          result[attribute] = value 
          end 
         end 
         end 
      result 
     end 
    end 

私はLDAPから取得する実際の応答は、このようなものです -

puts result.to_s

{ 
"dn"=>"CN=somename\\, somefirstname,OU=Users,DC=site,DC=com", 
"sn"=>"somename", 
"givenname"=>"somefirstname", 
"samaccountname"=>"someuserid", 
"mail"=>"[email protected]" 
} 

検索があるので

は*一致するすべてのエントリを検索するために、ワイルドカードを持っています。 Ldapは上記の形式で複数のエントリを返します。これと類似しています -

{ 
     "dn"=>"CN=somename\\, somefirstname1,OU=Users,DC=site,DC=com", 
     "sn"=>"somename1", 
     "givenname"=>"somefirstname1", 
     "samaccountname"=>"someuserid1", 
     "mail"=>"[email protected]" 
    }, 
    { 
     "dn"=>"CN=somename\\, somefirstname2,OU=Users,DC=site,DC=com", 
     "sn"=>"somename2", 
     "givenname"=>"somefirstname2", 
     "samaccountname"=>"someuserid2", 
     "mail"=>"[email protected]" 
    }, 
    { 
     "dn"=>"CN=somename\\, somefirstname3,OU=Users,DC=site,DC=com", 
     "sn"=>"somename3", 
     "givenname"=>"somefirstname3", 
     "samaccountname"=>"someuserid3", 
     "mail"=>"[email protected]" 
    }, 


A[a=>1,b=>11,c=>111] 
B[a=>2,b=>22,c=>222] 
C[a=>3,b=>33,c=>333] 
D[a=>4,b=>44,c=>444] 
+0

取得したい形式でconn.search呼び出しの結果と例を添付する必要があります。 –

+0

上記の例が必要ですか? –

+0

@PaulChechetin - Hey Paul、私は私の質問を更新しました。 –

答えて

0

私は質問を理解しているかどうかはわかりません。

私は Array.mapがあまりにも

私の仮定は良い選択だと思います

def self.Find(attribute, loginID) 
     conn = Net::LDAP.new :host => SERVER, 
          :port => PORT, 
          :base => BASE, 
          :auth => { 
             :username => 'admin', 
             :password => 'admin', 
             :method => :simple 
             } 
     if conn.bind 
      conn.search(:base => LDAPBASE, 
         :filter => Net::LDAP::Filter.eq(attribute, loginID+"*"), 
         :attributes => ['sAMAccountName','givenName','SN','mail'], 
         :return_result => true 
        ).reduce(Array.new) do |acc, el| 

         # 
         # Any modification of the entry must be here 
         # 

         acc + [el] 

         end 
      end 
     end 
end 

:ハッシュ

  • あなたが望む結果の形の

  • +0

    あなたの投稿の予想結果を変更しました。基本的には、属性とその値を持つ配列を含むハッシュリファレンス配列が必要です。 –

    +0

    属性とその値を含むハッシュの配列が必要だと思います。そうですか? –

    +0

    私はまだいくつかの説明が必要だと思います。あなたが必要とするのはあなたが持っているものです(conn.search'呼び出しの結果は、属性とその値を持つ配列を含む配列です)。それ以外に何が必要ですか? –