1
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 1 year has passed since last update.

pluckメソッドの使い方と注意点

Posted at

pluckメソッド

引数に指定したカラムの値を配列で返してくれるメソッド。
使い方は下記の通り。

モデル名.pluck(:カラム名)

実際に使用してみる。
20221001_ownersテーブルの画像.png

(nameカラムを指定したpluckメソッドを実行し、nameカラムの値を配列で取得する)

irb(main):011:0> Owner.pluck(:name)
   (0.2ms)  SELECT "owners"."name" FROM "owners"
=> ["田中", "伊藤", "高橋", "加藤"]

また、引数を「複数」設定することで、二次元配列で値を取得することができる。

例えば、テーブルが下記の内容であったとする。

20221001_ownersテーブルとcatsテーブルの画像.png

Railsコンソールを叩き、以下のデータをそれぞれ取得。

引数に指定したカラムの値を配列として取得。
irb(main):002:0> Owner.pluck(:name)
   (0.2ms)  SELECT "owners"."name" FROM "owners"
=> ["田中", "伊藤", "高橋"]


上記コマンドと同じ内容
irb(main):003:0> Owner.all.map(&:name)
  Owner Load (0.4ms)  SELECT "owners".* FROM "owners"
=> ["田中", "伊藤", "高橋"]

引数に複数のカラムを指定し、二次元配列で取得


irb(main):004:0> Owner.pluck(:name, :id)
   (0.3ms)  SELECT "owners"."name", "owners"."id" FROM "owners"
=> [["田中", 1], ["伊藤", 2], ["高橋", 3]]


複数の引数の順番を入れ替えて、表示

irb(main):005:0> Owner.pluck(:id, :name)
   (0.3ms)  SELECT "owners"."id", "owners"."name" FROM "owners"
=> [[1, "田中"], [2, "伊藤"], [3, "高橋"]]

・pluckメソッドの注意点
①オーバーライドを行うモデルメソッドには使用することができない。
②pluckメソッドの後ろにメソッドチェーンをすることはできない。

今回は、②を実際に見てみる。

(まず、Ownerモデルの全レコードを取得)
irb(main):010:0> Owner.all (今回は画像で表記)

20221001_ownersテーブルの画像.png

(次に、Ownerモデルにnameカラムを指定したpluckメソッドをかけ、指定したカラムの値を配列で取得する。)

irb(main):011:0> Owner.pluck(:name)
   (0.2ms)  SELECT "owners"."name" FROM "owners"
=> ["田中", "伊藤", "高橋", "加藤"]

(さらに、limitメソッドでデータの3つのみ取得できるようにする。)

irb(main):012:0> Owner.pluck(:name).limit(3)
   (0.2ms)  SELECT "owners"."name" FROM "owners"
Traceback (most recent call last):
        1: from (irb):12
NoMethodError (undefined method `limit' for ["田中", "伊藤", "高橋", "加藤"]:Array)

↓ここでエラー発生。理由は、pluckメソッドは「配列」を返し、limitメソッドはActive::Relationオブジェクト(User.allやUser.where(name: “hoge”)などで返ってくるもの)に対してしか使用することができないため

そこで対応策としては、先にモデルに対して、ActiveRecordメソッドのlimitメソッドを実行し、その後pluckメソッドを実行し、指定したカラムの値の配列を取得する。

irb(main):013:0> Owner.limit(3).pluck(:name)
   (0.2ms)  SELECT "owners"."name" FROM "owners" LIMIT ?  [["LIMIT", 3]]
=> ["田中", "伊藤", "高橋"]

これで、Ownerモデルのデータにlimitメソッドでデータの数を制限し、pluckメソッドで指定したカラムの値の配列を取得することができた。
pluckメソッドを使用するときは、レシーバがActive::Relationオブジェクトなのか配列なのか注意する。

1
0
1

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
1
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?