🐙
ActiveRecordのpluckメソッドでシンプルなコードを書く
レコードから値を取得したいとき、pluck
を使うと配列の処理をシンプルに書けます。
pluck
を使うことで、行ごとに完全なActiveRecordオブジェクトをロードせずに値を取得できるため、パフォーマンスアップも期待できます。
pluck
を使うとシンプルに書けることを実感できるようにサンプルコードを用意しました。
サンプルコード(修正前)
デフォルトユーザーと、レコードに登録したユーザー名の配列を取得します。
find_each
でActiveRecordオブジェクトを呼び出してname
を配列に追加しました。
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の機能が利用できない |

株式会社ラグザイア(luxiar.com)の技術広報ブログです。 ラグザイアはRuby on RailsとC#に特化した町田の受託開発企業です。フルリモートでの開発を積極的に推進しており、全国からの参加を可能にしています。柔軟な働き方で最新のソフトウェアソリューションを提供します。
Discussion