Rails

Rails でオブジェクトの配列を簡単にハッシュ化したい

More than 5 years have passed since last update.

例えば、User モデルの一覧を取得して、

User の name を key、オブジェクトを value とした hash を作りたいとします。

その場合、例えば以下のように実装しますよね。

User.all.inject({}) {|hash, user| hash[user.name] = user; hash }

# => {"美樹さやか"=>#<User id: 1,...>, "佐倉杏子"=> #<User id: 2,...">, "巴マミ"=>#<User id: 3,...>}

これをもっとエレガントに書けるんです。 …そう、Enumerable#index_by ならね。

User.all.index_by {|user| user.name }

# => {"美樹さやか"=>#<User id: 1,...>, "佐倉杏子"=> #<User id: 2,...">, "巴マミ"=>#<User id: 3,...>}

User.all.index_by(&:name)
# => {"美樹さやか"=>#<User id: 1,...>, "佐倉杏子"=> #<User id: 2,...">, "巴マミ"=>#<User id: 3,...>}

ただし、Enumerable#index_by は Rails (ActiveSupport) が追加しているメソッドなので、

デフォルトの Ruby では使えません…

(参考) http://apidock.com/rails/Enumerable/index_by