Hash#only, Hash#except に続いて、Hashを便利にするシリーズです。

今回は、Array#compactのように、Hashから値が空っぽのキーを取り除く Hash#compactを実装してみました。

hash_ext.rb

   1  class Hash
   2    def compact!(method = :nil?)
   3      each do |key, value|
   4        value.compact! method if value.respond_to? :compact!
   5        delete key if value.send method
   6      end
   7    end
   8  
   9    def compact(method = :nil?)
  10      dup.compact! method
  11    end
  12  end

非常に簡潔に書けますね。こんな感じの挙動をします。

   1  >> {'foo' => [], :bar => nil, :baz => ""}.compact
   2  => {"foo"=>[], :baz=>""}
   3  >> {'foo' => [], :bar => nil, :baz => ""}.compact :blank? # Rails
   4  => {}

値がcompact!を受け取れるオブジェクトの場合は、 再帰的に処理されます。

   1  >> {'foo' => {:bar => nil, :baz => ""}}.compact
   2  => {"foo"=>{:baz=>""}}
   3  >> {'foo' => {:bar => nil, :baz => ""}}.compact :blank? # Rails
   4  => {}

実際にどんなところで使えるかというと、フォームから送信された パラメータのうち、空っぽのものを削除してからARのアトリビュートを 更新したい場合なんかに便利かもしれません。

   1  class UserController
   2    def update
   3      @user = User.find(params[:id])
   4      @user.update_attributes(params[:user].compact :blank?)
   5    end

こんな感じですね。 パスワードとかが空っぽのときは、以前のまま 変更しないというような場合に簡単に対応できます。

posted by Png genki on Wed 12 Dec 2007 at 08:28
Contents
HashをスリムにするHash#compact
Comments
dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これ... '13-1
瀧内元気: おお、チェックしてみます。thx! '11-12
overisland: Reeder for iPhone もこの UI を実装していますね。 '11-12
瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 ... '11-12
tkawa: http://devcenter.heroku.com/articles/rails31_he... '11-12
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ