2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Rails]超有用なpluckメソッド

Last updated at Posted at 2021-04-23

pluckメソッドの使い勝手が良かったので自分なりにメモとして残しておきます

公式ドキュメント

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

使い方

User.pluck(:name)
=> ["モロヤン", "k蓮", "kouri", "ザキヤマ", "ふぅ", "山ちゃん。",
 "やんまー", "もとき", "字音", "江南スタイル", "やばめ", "オードリー",
 "karin", "march", "水鶏", "ルイルイ", "はぴたん", "keith_forest", 
"ヤッピー", "ゲストユーザー", "レイマン"]

上記のようにUserモデルのカラム(:name)を指定するとnameカラムを配列に入れて返してくれます。
また引数を2つ選択すると以下のようになります

User.pluck(:name,id)
=> [["モロヤン", 2], ["k蓮", 3], ["kouri", 4], ["ザキヤマ", 5], ["ふぅ", 6],
 ["山ちゃん。", 7], ["やんまー", 8], ["もとき", 9], ["字音", 10], ["江南スタイル", 11], 
["やばめ", 12], ["オードリー", 13], ["karin", 14], ["march", 15], ["水鶏", 16], ["ルイルイ", 17], 
["はぴたん", 20], ["keith_forest", 18], ["ヤッピー", 1], ["ゲストユーザー", 21], ["レイマン", 19]]

指定したカラム2つが一つの配列になり帰ってきます。またこれは以下のコードと同じオブジェクトが返ってくるなのでとてもスッキリしたと言えますね。

User.select(:id, :name).map { |c| [ c.name, c.id] }

ちょっとした違いとしてpluckの場合はモデルオブジェクト(Userのインスタンス)は作られませんが,selectだと(いったん)作られます。
@scivolaさんご指摘ありがとうございます。

すごい便利なpluckメソッドですが
公式ドキュメントでは以下の記載があります

pluckは、selectなどのRelationスコープと異なり、クエリを直接トリガするので、その後ろに他のスコープをチェインすることはできません。ただし、構成済みのスコープをpluckの前に置くことはできます。

どういう意味かというと以下の記述ができないということです。

User.pluck(:name).limit(1)

pluckの後ろには記述できないということですね。
この場合は以下のようにpluckの前に記述する必要があります

User.limit(1).pluck(:name)

pluckメソッドの使い方は以上です。

2
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?