2016-05-25 19 views
0

私は、従業員の名前をアクティブなディレクトリから引き出して、レール用のアプリケーションを作成しています。 「会議室」などのcn = peopleを持つ「実在しない人」のエントリがいくつか存在することを除いて、全体として機能しています。私はそれらを排除する必要があります。私は反復的なフィルタ結合でそれを行うことができますが、それはひどく非効率的でクラージーと思われます。このldapフィルタ結合は1つのステートメントで実行できますか?

私が今持っていることは「C」で始まる「A」(私は微調整する必要があることを知っている)と、指定された名前以上の姓で私にすべての従業員を与える

filter1 = (Net::LDAP::Filter.ge("sn", "a")) 
    filter2 = Net::LDAP::Filter.eq("givenName", "c*") 
    filter3 = Net::LDAP::Filter.ne("samaccountname", "croom") 
    treebase = "dc=xxxxxx,dc=com" 

    joined_filter = Net::LDAP::Filter.join(filter1, filter2) 
    joined_filter = Net::LDAP::Filter.join(joined_filter, filter3) 

    @temp_search = ldap.search(:base => treebase, :filter => joined_filter) 

です。 Filter3は会議室「croom」を除外します。配列をフィルターに渡すには何らかの方法があるはずです。 3つのフィルタをすべて結合に渡そうとすると、「間違った引数数」が発生する

'croom' 'croom2' 'breakroom'などの複数の除外を渡す方法はありますか?

答えて

2

ライブラリNet::LDAPライブラリでは、お勧めのようにNet::LDAP::Filterオブジェクトに配列を渡す方法はないようです。ただし、クラス#&メソッドを使用してフィルタに参加できます。

ような何か:あなたが利用可能な他の便利な方法のいくつかを見ることができますclassネットLDAPフィルタを見てみると

filters = Net::LDAP::Filter.ge("sn", "a") & 
      Net::LDAP::Filter.eq("givenName", "c*") & 
      Net::LDAP::Filter.ne("samaccountname", "croom") 
treebase = "dc=xxxxxx,dc=com" 

@temp_search = ldap.search(:base => treebase, :filter => filters) 

filter1 = Net::LDAP::Filter.ge("sn", "a") 
filter2 = Net::LDAP::Filter.eq("givenName", "c*") 
filter3 = Net::LDAP::Filter.ne("samaccountname", "croom") 
treebase = "dc=xxxxxx,dc=com" 

joined_filter = filter1 & filter2 & filter3 

@temp_search = ldap.search(:base => treebase, :filter => joined_filter) 

それとも少し良いです。

関連する問題