173
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

pluckメソッドが便利な件について

今回はpluckメソッドが便利だったので自分なりにまとめてみました。

pluckメソッドとは・・・

公式ドキュメントでは以下のように記載されています。

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

ふむふむ。わかったようなわからないような・・・

使い方は?

では、実際のコードを見ていきます。

Productモデルがあったとして、nameカラムの中身を確認したい場合は、

Product.pluck(:name)
=> ["Ruby on Rails Tote",
 "Ruby on Rails Bag",
 "Ruby on Rails Baseball Jersey",
 "Ruby on Rails Jr. Spaghetti",
 "Ruby on Rails Ringer T-Shirt",
 "Ruby Baseball Jersey",
 "Apache Baseball Jersey",
 "Ruby on Rails Mug",
 "Ruby on Rails Stein"]

といったようにProductモデル内のnameカラムを一覧表示することができます。

Product.pluck(:id,:name)
=> [[1, "Ruby on Rails Tote"],
 [2, "Ruby on Rails Bag"],
 [3, "Ruby on Rails Baseball Jersey"],
 [4, "Ruby on Rails Jr. Spaghetti"],
 [5, "Ruby on Rails Ringer T-Shirt"],
 [6, "Ruby Baseball Jersey"],
 [7, "Apache Baseball Jersey"],
 [8, "Ruby on Rails Mug"],
 [9, "Ruby on Rails Stein"]]

このように第二引数を設定することも可能です。

便利ですね〜

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

また上記のselectメソッド、mapメソッドを利用したコードと上記のコードは同等の意味になるので、pluckメソッドを上手く活用することでコードをシンプルに書くことができますね。

注意点

ただ、pluckメソッドには注意点もあります。

Product.pluck(:name).limit(1)   
=> NoMethodError: undefined method `limit' 

pluckメソッドは最初のようなケースではエラーが出てしまいます。

なぜなら、pluckメソッドはクエリを直接トリガするので、その後ろに他のスコープをチェインすることはできないからです。

Product.limit(1).pluck(:name)
=> ["Ruby on Rails Tote"]

ただし上記のように、構成済みのスコープに対してpluckの前に置くことはできます。

以上、簡単ではありますがpluckメソッドに関しての投稿でした。

【参考記事】
https://railsguides.jp/active_record_querying.html

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
173
Help us understand the problem. What are the problem?