230
184

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.

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

Last updated at Posted at 2018-11-30

今回は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

230
184
0

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
230
184

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?