Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

hashieでHash型を便利に拡張する(その2_DeepFind)

Hashieは既存Hashを拡張する形で運用するExtensionを持っています。

適用するには、インスタンスのexportメソッド

hash_instance.export Hashie::Extensions::ExtensionName

とするなり、自作Hash拡張クラス内で

class NewHash < Hash
 include Hashie::Extensions::Coercion
 ...
end

とすれば有効になります。

DeepFind

DeepFIndは込み入ったHashがあるときに有効です。
込み入ったHashの生成自体は、次の記事を参照してください。
初期状態でネストしたHashを生成する場合のTips - Bye Bye Moore

参考例

たとえば既存のハッシュとして以下のようなモノがあった時は

 user = {name: "shuzo_kino", subteam: [ {name: 'taro'}, { name: 'jiro' }]}
#=> {:name=>"shuzo_kino", :subteam=>[{:name=>"taro"}, {:name=>"jiro"}]}
user.extend Hashie::Extensions::DeepFind

とやって、拡張します。

以降は、深く入り組んだハッシュから同名のカラムを引っ張り出す事ができるようになります。

user.deep_find :name
=> "shuzo_kino"

user.deep_find_all :name
=> ["shuzo_kino", "taro", "jiro"]

Hashie::Extensions::DeepFind#deep_find_allに関しては
原文によると

 alias_method :deep_select, :deep_find_all

エイリアスが貼られているので

user.deep_select :name
=> ["shuzo_kino", "taro", "jiro"]

とやってあげる事も可能です。