Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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"]

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