🐡
ActiveSupport で配列の値を要素とした Hash に変換する Enumerable#index_by
records.to_h { [_1.id, it] } みたいなコードを書いてたら #index_by を使え!と Rubocp に怒られたので覚書。
ActiveSupport の Enumerable#index_by は『レシーバの値を要素としてブロックの戻り値をキー』として Hash に変換するためのメソッドです。
require "active_support/all"
data = ["homu", "mami", "mado"]
# レシーバがキーとなり、そのキーを引数としてブロックを呼び出す
# ブロックの戻り値がそのキーの要素となる
pp %w(homu mami mado).index_by { _1.__id__ }
# => {272 => "homu", 280 => "mami", 288 => "mado"}
これを踏まえると最初に怒られた records.to_h { [_1.id, it] } は records.index_by { _1.id } と記述できます。
知ってれば #index_by のほうがわかりやすい気もするんですが #index_by という言葉から Hash を返すイメージが全然できないので個人的には #to_h のほうが普通にわかりやすい気がしますねえ。
Rubocop で指摘されるほどでもない気がする。
Discussion