Railsのselectとpluckの使い分け完全ガイド|クエリ最適化で高速化する方法を初心者向けに解説
生徒
「Railsってデータベースからデータを取ってくるのが遅くなることがあるって聞いたんですが、どうしてですか?」
先生
「必要以上にたくさんの情報を取りに行っていることが原因の一つですね。」
生徒
「全部のデータを取らないといけないと思ってました……」
先生
「Railsでは、必要なカラムだけ取得する方法があります。selectやpluckを使うと、とても効率が良くなりますよ。」
1. Railsとは?データベースとやり取りする仕組み
Rails(Ruby on Rails)は、Webアプリケーションを作るための仕組みが最初からたくさん用意されているフレームワークです。フレームワークとは、アプリを作るための便利な土台のようなものです。
Railsでは、データベースという「情報を保存する箱」からデータを取り出すときに、Active Recordという仕組みを使います。これにより、難しいSQLを書かなくても、Rubyのコードだけでデータを扱えます。
2. なぜ必要なカラムだけ取得すると良いのか
カラムとは、表の「列」のことです。たとえば「名前」「メールアドレス」「年齢」などがカラムです。
スーパーで買い物をするときに、牛乳だけ欲しいのにカゴいっぱいの商品を持ってレジに行くと時間がかかりますよね。Railsでも同じで、必要ないカラムまで全部取得すると、通信量が増えて表示が遅くなります。
これを防ぐために、Railsではselectやpluckを使って、必要な情報だけを取得します。これをクエリ最適化と呼びます。
3. selectとは?必要なカラムを指定して取得する方法
selectは、「このカラムだけ使います」と指定する方法です。取得したデータは、通常のモデルと同じように扱えます。
users = User.select(:id, :name)
users.each do |user|
puts user.name
end
この例では、usersテーブルからidとnameだけを取得しています。メールアドレスなど、使わない情報は取得しません。
selectは「データの形を保ったまま、軽くする」イメージです。
4. pluckとは?値だけを直接取り出す方法
pluckは、モデルの形ではなく、必要な値だけを配列として取り出します。
names = User.pluck(:name)
puts names
["田中", "佐藤", "鈴木"]
pluckは「箱ごと」ではなく「中身だけ」取り出す方法です。そのため、とても高速です。
ただし、モデルの機能(バリデーションなど)は使えません。
5. selectとpluckの使い分けの考え方
どちらを使うかは、目的で決めます。
- 画面表示やオブジェクトとして扱いたい → select
- 一覧や集計で値だけ欲しい → pluck
# selectの例
users = User.select(:id, :email)
# pluckの例
emails = User.pluck(:email)
初心者のうちは「値だけ欲しいならpluck」と覚えると分かりやすいです。
6. クエリ最適化と転送量削減の関係
Railsアプリでは、サーバーとブラウザの間でデータをやり取りします。このとき、データが多いほど時間がかかります。
selectやpluckを使うことで、転送量(データの量)を減らせます。これは、表示速度の改善やサーバーの負担軽減につながります。
User.all.each do |user|
puts user.name
end
このコードは全カラムを取得します。初心者がよく書きがちですが、実務では注意が必要です。
7. N+1問題との関係をやさしく理解する
N+1問題とは、「最初に1回、その後に何度もデータベースにアクセスしてしまう問題」です。
includesやeager_loadと一緒に、selectやpluckを使うことで、無駄なデータ取得を防げます。
Bulletというツールを使うと、「ここ無駄ですよ」と教えてくれます。初心者にはとても心強い味方です。
8. 初心者がよくやる間違いと注意点
selectで取得していないカラムを使おうとすると、エラーになります。
user = User.select(:name).first
user.email
この場合、emailは取得していないため使えません。必要なカラムは事前に考えておきましょう。
最初は難しく感じますが、「使うものだけ持ってくる」を意識するだけでOKです。