2
2

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メソッドと結婚したい

Posted at

突然ですが…

①あなたの身近にいる「とてつもなく仕事ができる同僚」を思い浮かべてください。
②あなたの「奥様」。あるいは「理想的な女性(男性)」を思い浮かべてください。

その二人をmergeしたようなメソッド。とてつもなく仕事ができて、なおかつ朗らかで柔らかい。それこそが今回ご紹介する「pluck(プラック)メソッド」なのです。

(…すみません真面目にやります)

概要

この記事は、

1.pluckとはどのようなメソッドなのか
2.pluckはどのような場面で使えるのか

について解説を行うものです。
(※すでにpluckメソッドを使いこなしている方にとっては、この記事は無益です。)

pluckとはどのようなメソッドなのか

結論、__「あるカラムの値を配列で取得する」__メソッドです。

テーブルを例に解説します。

usersテーブル( id, name, age )

id name age
1 ken 21
2 takuya 22
3 masato 29
4 kouta 24
5 hirokatsu 23
6 yuuhei 28
7 takumi 25
8 akihito 26

例えばこのようなテーブルがあった場合、pluckメソッドを使うことで、

users_controller.rb
@users = User.pluck(:id)

# 以下出力結果 
@users = [1, 2, 3, 4, 5, 6, 7, 8]

このように、__モデル名.pluck(カラム名)__とすることで、そのカラムの中身を配列として取得することができました。

さらには、第二引数を指定することもできて…

users_controller.rb
@users = User.pluck(:id, :name) #第二引数にnameを指定

# 以下出力結果 
@users = [ [1, "ken"],[2, "takuya"],[3, "masato"],[4, "kouta"],
[5, "hirokatsu"],[6, "yuuhei"],[7, "takumi"],[8, "akihito"] ]

このように複数の引数を渡して、配列で取得することも可能です。
第三引数、第四引数を渡しても同様に配列で取得します。

ちなみに配列なので、取得方法は多少変わりますが、

users_controller.rb
@users = User.pluck(:id, :name) #第二引数にnameを指定


@users[0][1] = "ken" #最初の配列 [1,"ken"] の2番目の要素なので "ken" を取得  
@users[3][0] = 1  #4番目の配列[4,"kouta"] の1番目の要素なので 1 を取得

のように、中身を取得することができます。

pluckメソッドを使うとできること

では、pluckメソッドを使うとどんなことができるのでしょうか?

あるカラムに特定のレコードが存在するか調べることができる

例えば、「Userモデルの中に24歳のデータがあるか調べたい」場合、

users_controller.rb
User.where(age: 24).exists?
# => true

上のようにすると取得できますが、pluckメソッドを使うと

users_controller.rb
User.pluck(:age).include?(24)
# => true

このような式で取得することができます。
__「…いやどっちでもよくね?」__と思われるかもしれませんが、この2つなら私はpluckを使います。理由は次で説明しますね。

データの取得速度が向上する

先ほどの2つの式は、一見すると結果は同じに見えます。
しかし、行われている処理や、取得しているデータの数は全く違います。

users_controller.rb
User.where(age: 24).exists?

↓ この時発行されるクエリ(SQLに対する命令)がこちらです ↓

MySQL
User Exists? (0.6ms)  SELECT 1 AS one FROM `users` WHERE `users`.`age` = 24 LIMIT 1
=> true

それでは、pluckメソッドを使うとどうなるのでしょうか?

users_controller.rb
User.pluck(:age).include?(24)

↓ 発行されるクエリ(SQLに対する命令)がこちら ↓

MySQL
(0.5ms)  SELECT `users`.`age` FROM `users`
=> true

明らかに短いのがお分かりでしょうか?
処理にかかる時間も、0.1ミリ秒違います。

前者では、「24歳のユーザーが存在するかどうか」を調べているのに対し、
後者は「ユーザーの年齢の中に24歳のデータがあるかどうか」を調べています。

つまりpluckを用いることで、
__必要なカラムのみを取得できるため、クエリが短くなり、処理が早くなる__ということです。

データが増えれば増えるほど、処理速度の差は開きます。
「ポートフォリオを作ったけど、なんだか処理がもっさりしてるな…」という方は、データ取得の記述を見直してみてはいかがでしょうか?

##まとめ

①pluckメソッドは、__「あるカラムの値を配列で取得する」__メソッド
②pluckを使うことで、場合によっては無駄なクエリの発行を押さえ、処理速度が向上する

少しでもpluckメソッドの良さが伝わっていれば幸いです…
最後までご覧いただき、ありがとうございました。

2
2
2

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
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?