if it does't challenge you, it can't change you

RubyのWebエンジニアやってます。主にRuby on Railsのことで勉強になったこと書いていきます。

【Ruby】もっと早く知っていればよかったmapメソッド

mapメソッド

mapメソッドとは、配列やハッシュに対して使えるメソッドで、要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返します。
↑と、Rubyリファレンスには書かれております。
このメソッドを知った時は、このメソッドを知らないのは罪だと思いましたwww
なぜなら、このメソッドを知らない自分はこんなことをやったらからです。

mapメソッドを知らないとき

半年ほど前から、カップル専用の家計簿アプリを作っているのですが、家計簿には当然カテゴリ分けがあります。
実装していく中で、特定の条件のカテゴリのidを集めたいと思いました。
まず、何回も使わなければいけないと思ったので、モデルにscopeを追加しました。

extract_category, -> {unscope(:order).select(:category_id).distinct.pluck(:category_id)}

すでにこのスコープを作るのにも一苦労しました。
orderが既にかかったものにselectなどがかけられなかったのです。
次に、このメソッドを呼び出すときです。

category_ids = (current_user_expenses.extract_category  + partner_expenses.extract_category)

このように、scopeを使ったとしても、何回もそのscopeを呼び出していました。

mapメソッドを知った後

それがmapメソッドを使うとこんなにも簡単に書けます。

category_ids = (current_user_expenses + partner_expenses).map{|i| i.category_id}

scopeなどは必要なかったんです。
mapを使えばすごく簡単に書けました。
エイリアスメソッドとして、collectメソッドもあります。
どちらも同じ挙動ですが単語のニュアンスとして、collectのほうが読んでいてしっくり来るときがあります。
実は上記の場合は、collectのほうが僕は好きですね。

上記とは変わっていますが、実際の改修したコード こちらになります。

mapメソッドのようなブロックを使った便利メソッドは他にもいくつかあるので、しっかり勉強しようと思いました。