rails:index_byメソッドで配列をkey-value型hashに変換

配列で受け取ったデータをeachで検索(リニアサーチ)するより、key-value型のhashに変換してkey指定で取得した方が、コストもかからず効率がよい。

index_by メソッドを使うと、key-value型のハッシュに変換してくれる。
ただし、このメソッドは rails(active_support)でサポートされているので、通常のrubyでは使用できないので注意。
(active_support によって Enumerable に追加されたメソッド)

なお、index_byメソッド では値を一つしか保持しないため、同じ key を持つデータが複数ある場合には後から来たデータに値が上書きされるので、keyに使用するのは、ユニークな項目であることが前提。

例えば、以下のような結果になるActiveRelation集合があったとする。

> @a = Master.find_by(status : 10)
[{key: 1, status: 10, staff_id: 8}, {key: 5, status: 10, staff_id: 1}]

> @ai = @a.index_by(&:staff_id)
[{8: {key: 1, status: 10, staff_id: 8}}, (1: {key: 5, status: 10, staff_id: 1}}]

>@as[8]
{key: 1, status: 10, staff_id: 8}}
>@as[1]
{key: 5, status: 10, staff_id: 1}

>@as[8].status
10

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

Railsでindex_byを使ってハッシュ形式のデータを受け取る - (゚∀゚)o彡 sasata299's blog