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