コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

RailsでActiveRecordからidがキーのHashを作りたいときはindex_by が便利

表題ですべてを語るシリーズです。

検証した環境

$ bin/rails -v
Rails 7.1.2

index_byとは

Railsガイドの説明が簡潔なので引用する。

index_byメソッドは、何らかのキーによってインデックス化されたenumerableの要素を持つハッシュを生成します。 - Active Support コア拡張機能 - Railsガイド- 9.1 index_by

今回の事例

レコードのidをKeyにして、Valueに実態のModelのレコードが入っているHashを用意したい場合。今回はBookモデルのすべての値を対象とする。

index_byを使わない場合

以下のような書き方になる

result_hash = Book.all.each_with_object({}) do |object, hash|
  hash[object.id] = object
end

index_byを使う場合

以下のように書ける

result_hash = Book.all.index_by(&:id)

関連リンク