🐙

ActiveRecordのpluckメソッドでシンプルなコードを書く

2025/03/05に公開

レコードから値を取得したいとき、pluckを使うと配列の処理をシンプルに書けます。
https://railsdoc.com/page/model_pluck
pluckを使うことで、行ごとに完全なActiveRecordオブジェクトをロードせずに値を取得できるため、パフォーマンスアップも期待できます。

pluckを使うとシンプルに書けることを実感できるようにサンプルコードを用意しました。

サンプルコード(修正前)

デフォルトユーザーと、レコードに登録したユーザー名の配列を取得します。
find_eachでActiveRecordオブジェクトを呼び出してnameを配列に追加しました。

https://railsdoc.com/page/find_each

default_users = ['鹿野', '蝶野']

def fetch_user_names(user_ids)
  users = default_users
  UserRecord.where(user_id: user_ids).find_each do |record|
    users << record.name
  end

  users
end

問題点

  • find_each を使ってレコードを1件ずつ処理する必要があり、冗長。
  • ActiveRecord オブジェクトをインスタンス化するため、メモリ負荷が増加。

サンプルコード(修正後)

pluckを使って直接nameカラムの値を配列として取得します。

default_users = ['鹿野', '蝶野']

def fetch_user_names(user_ids)
  default_users + UserRecord.where(user_id: user_ids).pluck(:name)
end

シンプルに書くことができ、不要なActiveRecordオブジェクトの生成も防ぐことができました。
コードレビューをするときに、ActiveRecordオブジェクトから値を取り出すだけの簡単な操作をしていたらpluckに置き換えられないか検討するとよさそうです。

まとめ

  • カラムの値を取得したいだけの場合は、pluck を使用するとシンプルに書ける。
  • 大量データを扱う、またはActiveRecordオブジェクトとしての振る舞いが必要な場合は、find_each を使用する。
方法 メリット デメリット
find_each ActiveRecordオブジェクトを扱える 扱うデータ量が多い場合は冗長、オブジェクト生成のオーバーヘッドがある
pluck シンプルで高速、メモリ効率が良い(大量データでも安全) ActiveRecordの機能が利用できない
ラグザイア

Discussion