Rails

【Rails】カラム情報を複数取得できるpluckメソッドが便利なのでおすすめしたい

Rails

 

今回はカラム情報を複数取得することができるメソッド、pluckメソッドについて解説したいと思います。selectメソッドとmapメソッドを併用して複数のカラム情報を取得することもできますが、pluckメソッドを使用するとより簡単に記述できるため、ぜひ使って欲しいメソッドの1つです。

加えて、pluckメソッドは取得したデータを自動で配列に変換してくれるよ。

pluckメソッドとは

pluckメソッドはカラム情報を複数取得することができるメソッドです。

pluckメソッドについて、Railsガイドには以下のように記されています。

pluckは、1つのモデルで使用されているテーブルからカラム (1つでも複数でも可) を取得するクエリを送信するのに使用できます。引数としてカラム名のリストを与えると、指定したカラムの値の配列を、対応するデータ型で返します。

使い方

では実際にpluckメソッドの使い方を見ていきましょう。

今回はpostsテーブルにtitleカラムとuser_idカラムがあると仮定します。

postsテーブル

 

まずはpostsテーブルからtitleの情報を取得してみます。

以下のように記載することで、titleの情報を全て取得することができます。

% rails c
pry(main)> Post.pluck(:title)
=> ["テスト投稿", "aaa", "aaaa"]
冒頭にも書いた通り、取得した値は配列に格納されているね。

 

続いて、idとtitleとuser_idの3つの情報を取得してみます。

以下のように記載することで、idとtitleとuser_idの情報を全て取得することができます。

% rails c
pry(main)> Post.pluck(:id, :title, :user_id)
=> [[1, "テスト投稿", 1], [2, "aaa", 1], [3, "aaaa", 1]]

 

これは同様に、selectメソッドとmapメソッドを併用して記述することもできます。

% rails c
pry(main)> Post.select(:id, :title, :user_id).map { |c| [c.id, c.title, c.user_id] }
=> [[1, "テスト投稿", 1], [2, "aaa", 1], [3, "aaaa", 1]]
pluckメソッドの方が記述はスマートになるね。

注意点

pluckメソッドはとても便利なメソッドですが、1点注意しなければならないことがあります。

それは、pluckメソッドの後ろにメソッドチェーンすることはできないということです。

メソッドチェーンとは「pluck(:title).limit(5)」のようにメソッド同士を連結させることを言います。

 

例を見てみましょう。

以下のように記述してしまうと配列に対してlimitメソッドがundefinedになってしまいます。

% rails c
pry(main)> Post.pluck(:title).limit(1)
NoMethodError: undefined method `limit' for ["テスト投稿", "aaa", "aaaa"]:Array
from (pry):1:in `__pry__'

 

この場合、pluckメソッドの前でメソッドチェーンを行うことで解決することができます。

% rails c
pry(main)> Post.limit(1).pluck(:title)
=> ["テスト投稿"]

参考

Railsガイド:https://railsguides.jp/active_record_querying.html

 

 

今回はカラム情報を複数取得することができるメソッド、pluckメソッドについて解説しました。pluckメソッドは、大規模なクエリや使用頻度の高いクエリで使用するとパフォーマンスが向上するので積極的に使いたいメソッドの1つですね。