pluckメソッド
引数に指定したカラムの値を配列で返してくれるメソッド。
使い方は下記の通り。
モデル名.pluck(:カラム名)
(nameカラムを指定したpluckメソッドを実行し、nameカラムの値を配列で取得する)
irb(main):011:0> Owner.pluck(:name)
(0.2ms) SELECT "owners"."name" FROM "owners"
=> ["田中", "伊藤", "高橋", "加藤"]
また、引数を「複数」設定することで、二次元配列で値を取得することができる。
例えば、テーブルが下記の内容であったとする。
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 (今回は画像で表記)
(次に、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オブジェクトなのか配列なのか注意する。