Rubyでのデータ抽出、"pluck"メソッドを使いこなす10のステップ – Japanシーモア

Rubyでのデータ抽出、”pluck”メソッドを使いこなす10のステップ

Rubyのプログラムコードと、その説明が書かれたのスクリーンショットRuby
この記事は約12分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

このサービスは複数のSSPによる協力の下、運営されています。

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事では、Rubyのプログラムにおいて頻繁に出てくるデータ抽出について、特に”pluck”メソッドを中心に詳しく解説します。

具体的なサンプルコードとともに、基本的な使い方から、より応用的な使用例、注意点と対処法までを順を追って解説します。

この記事を読めば、Rubyでのデータ抽出、特に”pluck”メソッドの使い方について理解を深め、実際のコードでの活用ができるようになります。

●Rubyとは

Rubyは、1995年に日本人のまつもとゆきひろ氏によって開発されたプログラミング言語です。

直感的で人間中心の設計がされており、美しいコードを書くことを重視しています。

○Rubyの特徴

Rubyの最大の特徴はその表現力の豊かさと高い生産性です。

Rubyは、コードが自然な英語のように読めるため、初心者でも学びやすいという特徴があります。

また、オブジェクト指向プログラミングを完全にサポートしており、柔軟なプログラミングが可能です。

●pluckメソッドとは

Rubyでデータ操作を行う際に、”pluck”メソッドは非常に便利なツールです。

“pluck”メソッドは、データベースから特定のカラムだけを抽出したい場合に使用します。

○pluckメソッドの基本

具体的には、例えばUserというモデルがあり、その中のnameカラムだけを取り出したい場合は次のように書くことができます。

names = User.pluck(:name)

これを実行すると、Userモデルの全てのレコードの中からnameカラムのデータだけを取り出して、配列として返してくれます。

●pluckメソッドの使い方

ここからは、”pluck”メソッドの詳しい使い方と、それぞれの使い方の具体的なサンプルコードを見ていきましょう。

○サンプルコード1:pluckメソッドの基本的な使用法

最初は先程の例を詳しく見ていきましょう。

次のようなUserモデルがあるとします。

class User < ApplicationRecord
  # モデルの中身
end

このUserモデルには、nameというカラムが存在し、その中にはユーザーの名前が格納されています。

全てのユーザーの名前を取り出したい場合には、”pluck”メソッドを使うことで簡単に取得できます。

names = User.pluck(:name)

このコードを実行すると、”name”カラムの全ての値が配列として返されます。

例えば、Userモデルに”John”, “Jane”, “Bob”という名前のユーザーがいる場合、その実行結果は次のようになります。

["John", "Jane", "Bob"]

以上が、”pluck”メソッドの最も基本的な使用法です。

あるモデルから特定のカラムの値だけを配列として取得したい場合には、このように”pluck”メソッドを使うことができます。

○サンプルコード2:pluckメソッドとwhereメソッドの組み合わせ

pluckメソッドは他のActiveRecordメソッドと組み合わせて使用することができます。

その一つがwhereメソッドです。

whereメソッドは特定の条件を満たすレコードを探す際に使用します。

次のコードは、nameが”John”というユーザーだけの名前を取り出す例です。

johns = User.where(name: 'John').pluck(:name)

このコードを実行すると、Userモデルの中からnameが”John”のユーザーだけを抽出し、そのnameカラムの値を配列として返します。

例えば、Userモデルに”John”, “John”, “Jane”, “Bob”という名前のユーザーがいる場合、その実行結果は次のようになります。

["John", "John"]

pluckメソッドとwhereメソッドを組み合わせることで、特定の条件を満たすレコードの特定のカラムの値だけを効率よく抽出することができます。

○サンプルコード3:pluckメソッドとmapメソッドの違い

次に、pluckメソッドとよく似た機能を持つmapメソッドとの違いについて説明します。

次の二つのコードは、どちらも全てのユーザーの名前を取り出します。

names_with_pluck = User.pluck(:name)
names_with_map = User.all.map(&:name)

しかし、これら二つのコードは内部で行う処理が異なります。

pluckメソッドはデータベースレベルで特定のカラムのデータだけを取り出しますが、mapメソッドはまず全てのユーザーレコードを取り出してからRubyのレベルで名前を取り出しています。

つまり、pluckメソッドを使用する方がメモリ効率が良く、大量のデータを扱う場合には特にpluckメソッドの使用が推奨されます。

○サンプルコード4:pluckメソッドで複数のカラムを取得する

また、pluckメソッドは一つのカラムだけでなく、複数のカラムを同時に取得することも可能です

次のコードは、全てのユーザーの名前とメールアドレスを取得する例です。

names_and_emails = User.pluck(:name, :email)

このコードを実行すると、nameとemailカラムの値が配列の形で返されます。

それぞれの配列は一つのユーザーの情報を表しています。例えば、Userモデルに下記のユーザーがいる場合

  1. name: “John”, email: “john@example.com”
  2. name: “Jane”, email: “jane@example.com”
  3. name: “Bob”, email: “bob@example.com”

その実行結果は次のようになります。

[["John", "john@example.com"], ["Jane", "jane@example.com"], ["Bob", "bob@example.com"]]

このように、pluckメソッドを使用することで簡単に複数のカラムの値を配列として取得することができます。

●pluckメソッドの応用例

Rubyのpluckメソッドを用いて、さらに高度なデータ操作を行う方法についてご紹介します。

ここでは、大量のデータから特定の情報を抽出する、データを高速に抽出する、複数のテーブルからデータを抽出する、という3つの応用例を具体的なサンプルコードと共に解説します。

○サンプルコード5:pluckメソッドで大量のデータから特定の情報を抽出

大量のデータを扱う際、pluckメソッドはそのパフォーマンスと効率性から重要な役割を果たします。

ここでは、50,000人のユーザーの中から特定の条件を満たすユーザーの名前だけを取り出す例を考えてみましょう。

selected_names = User.where('age >= 18 and age < 25').pluck(:name)

このコードでは、ageが18以上25未満のユーザー(つまり18歳から24歳のユーザー)の名前だけを取り出しています。

whereメソッドで条件を指定し、その後でpluckメソッドを用いて名前だけを抽出しています。

このように、pluckメソッドは大量のデータを効率的に扱うのに非常に便利です。

○サンプルコード6:pluckメソッドでデータを高速に抽出

pluckメソッドはデータベースからデータを抽出する際のパフォーマンスも向上させます。

全てのデータをActiveRecordオブジェクトとしてロードする代わりに、必要なカラムだけを取得します。

次のコードは、全てのユーザーのメールアドレスを取得する例です。

emails = User.pluck(:email)

このコードを実行すると、全てのユーザーのメールアドレスが配列として返されます。

これにより、ActiveRecordオブジェクト全体をメモリにロードする必要がなくなり、メモリ使用量を大幅に削減できます。

○サンプルコード7:pluckメソッドで複数のテーブルからデータを抽出

また、pluckメソッドはjoinメソッドと組み合わせて、複数のテーブルからデータを抽出することも可能です。

次のコードは、ユーザーとその所属するグループの名前を取得する例です。

ここではUsersテーブルとGroupsテーブルがあり、それぞれのテーブルはuser_idで関連付けられていると仮定します。

names = User.joins(:group).pluck('users.name', 'groups.name')

このコードは、UsersテーブルとGroupsテーブルを結合し、各ユーザーとその所属するグループの名前を抽出します。

このとき、抽出するカラム名はテーブル名とカラム名をドットでつなげた形式で指定します。

●注意点と対処法

Rubyのpluckメソッドを使用する際に注意すべき点と、それらの問題を解決する方法について説明します。

○注意点1:pluckメソッドはActiveRecordオブジェクトを返さない

最初に注意するべき点は、pluckメソッドはActiveRecordオブジェクトではなく、抽出したデータの配列を直接返すという点です。

そのため、pluckメソッドで取得したデータに対して、ActiveRecord特有のメソッドを呼び出すことはできません。

下記のコードは、pluckメソッドを使ってユーザーの名前を取得し、その名前に対してupcaseメソッド(文字列を大文字にするメソッド)を呼び出す例です。

User.pluck(:name).upcase

このコードはエラーを引き起こします。なぜなら、upcaseメソッドは文字列に対してのみ使用でき、配列には使用できないからです。

○対処法1

この問題を解決するには、配列の各要素に対してupcaseメソッドを適用すれば良いです。

これはRubyのmapメソッドを使用して行うことができます。

User.pluck(:name).map(&:upcase)

このコードでは、pluckメソッドで取得した名前の配列に対して、mapメソッドを用いてupcaseメソッドを適用しています。

この結果、全ての名前が大文字に変換された新たな配列が返されます。

○注意点2:pluckメソッドは複数のカラムを引数に取ることができるが、返す配列の形式に注意

pluckメソッドは複数のカラムを引数に取ることができます。

しかし、複数のカラムを引数に取った場合、返されるのは二次元配列です。

User.pluck(:name, :age)

このコードを実行すると、[名前, 年齢]という形式の配列が要素として格納された二次元配列が返されます。

○対処法2

これが期待した動作でない場合は、返された二次元配列を適切な形式に変換する必要があります。

例えば、名前と年齢を組み合わせたハッシュを得たい場合は、次のようにmapメソッドを使用して配列を変換できます。

User.pluck(:name

, :age).map { |name, age| { name: name, age: age } }

このコードでは、pluckメソッドで取得した配列の各要素(名前と年齢の配列)に対して、ブロックを適用しています。

このブロック内では、名前と年齢の配列をハッシュに変換しています。

●pluckメソッドのカスタマイズ方法

ここでは、Rubyのpluckメソッドをカスタマイズして、さらに便利に使うための方法について説明します。

○カスタマイズ例1:条件を指定してデータを抽出する

pluckメソッドと組み合わせてwhereメソッドを使用することで、特定の条件を満たすデータだけを抽出することができます。

下記のコードでは、年齢が20歳以上のユーザーの名前だけを抽出しています。

User.where('age >= ?', 20).pluck(:name)

このコードではまず、whereメソッドを使用して年齢が20歳以上のユーザーを抽出しています。

次に、その結果に対してpluckメソッドを適用して、名前だけを抽出しています。

○カスタマイズ例2:集約関数と組み合わせて使用する

pluckメソッドは、集約関数(例:平均、合計、最大、最小など)と組み合わせて使用することもできます。

この機能を利用すると、データベースの集約操作を一行のコードで行うことができます。

次のコードは、ユーザーの平均年齢を計算する例です。

User.pluck(Arel.sql('AVG(age)')).first

このコードでは、pluckメソッドにAVG関数を使用して平均年齢を計算するSQL文を渡しています。

また、pluckメソッドは常に配列を返すため、最後にfirstメソッドを使用して配列の最初の要素(平均年齢)を取得しています。

○カスタマイズ例3:複数のテーブルからデータを抽出する

最後に、pluckメソッドを使って複数のテーブルからデータを抽出する方法を見てみましょう。

これには、Rubyのjoinsメソッドと組み合わせて使用します。

下記のコードは、ユーザーテーブルと注文テーブルを結合し、ユーザーの名前とそのユーザーの注文数を抽出する例です。

User.joins(:orders).group(:name).pluck('users.name, COUNT(orders.id)')

このコードでは、まずjoinsメソッドを使用してユーザーテーブルと注文テーブルを結合しています。

その後、groupメソッドで名前ごとにグループ化し、最後にpluckメソッドでユーザーの名前と

注文数を抽出しています。

まとめ

この記事では、Rubyのpluckメソッドを使用してデータを効率的に抽出する方法を詳しく説明しました。

pluckメソッドは、データベースから特定の列だけを高速に取得するための強力なツールです。

まず、pluckメソッドの基本的な使用方法と、その実行結果を確認しました。

次に、メモリ効率や処理速度の観点からpluckメソッドの利点を見てきました。

そして最後に、pluckメソッドをさらに強力にするためのカスタマイズ方法をいくつか紹介しました。

Rubyのpluckメソッドは、特定の列だけを抽出したいとき、またはデータ量が大きくても高速に処理したいときに非常に役立ちます。

条件指定によるデータ抽出、集約関数との組み合わせ、複数テーブルからのデータ抽出といったカスタマイズ方法を駆使することで、より効率的なデータ処理を行うことが可能となります。

これらの知識を活かし、Rubyプログラミングのスキルをさらに向上させていきましょう。

今後もRubyやその他のプログラミング言語に関する役立つ情報を提供していきますので、ぜひお楽しみに。