ActiveLdap::Base#find の :filter キーに渡した引数の結果、どんなフィルタが生成されるかを確認する

タイトルが長い。

以前の記事で、ActiveLdap::Adapter::Base#parse_filter がフィルタのパーシングを行うという話を書いたのだけれども、これを外から確認したくなった。正確には、フィルタを手で書くのがすごく面倒で面倒で生きている意味が判らなくなったのでプログラムに任せたら素敵と思った。

先ず ActiveLdap::Adapter::Base なのだが ActiveLdap::Base.connection で取得できる。一方、parse_filter は private なので instance_eval とかを使う。

uid:hogehoge さんを検索するフィルタを取得する

>> filter = [:uid, "hogehoge"]
=> [:uid, "hogehoge"]
>> ActiveLdap::Base.class_eval{connection.instance_eval{parse_filter filter}}
=> "(uid=hogehoge)"

複雑なやつ

>> uid_filter = [:uid, 'u*']
=> [:uid, "u*"]
>> ou_or_filter = [:or, {:ou => ["dev", "manage", "operation"]}]
=> [:or, {:ou=>["dev", "manage", "operation"]}]
>> filter = [:and, uid_filter, ou_or_filter]
=> [:and, [:uid, "u*"], [:or, {:ou=>["dev", "manage", "operation"]}]]
>> ActiveLdap::Base.class_eval{connection.instance_eval{parse_filter filter}}
=> "(&(uid=u*)(|(ou=dev)(ou=manage)(ou=operation)))"

まとめ:便利だから使うといいかもしれない。