突然ですが…
①あなたの身近にいる「とてつもなく仕事ができる同僚」を思い浮かべてください。
②あなたの「奥様」。あるいは「理想的な女性(男性)」を思い浮かべてください。
その二人を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 = User.pluck(:id)
# 以下出力結果
@users = [1, 2, 3, 4, 5, 6, 7, 8]
このように、__モデル名.pluck(カラム名)__とすることで、そのカラムの中身を配列として取得することができました。
さらには、第二引数を指定することもできて…
@users = User.pluck(:id, :name) #第二引数にnameを指定
# 以下出力結果
@users = [ [1, "ken"],[2, "takuya"],[3, "masato"],[4, "kouta"],
[5, "hirokatsu"],[6, "yuuhei"],[7, "takumi"],[8, "akihito"] ]
このように複数の引数を渡して、配列で取得することも可能です。
第三引数、第四引数を渡しても同様に配列で取得します。
ちなみに配列なので、取得方法は多少変わりますが、
@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歳のデータがあるか調べたい」場合、
User.where(age: 24).exists?
# => true
上のようにすると取得できますが、pluckメソッドを使うと
User.pluck(:age).include?(24)
# => true
このような式で取得することができます。
__「…いやどっちでもよくね?」__と思われるかもしれませんが、この2つなら私はpluckを使います。理由は次で説明しますね。
データの取得速度が向上する
先ほどの2つの式は、一見すると結果は同じに見えます。
しかし、行われている処理や、取得しているデータの数は全く違います。
User.where(age: 24).exists?
↓ この時発行されるクエリ(SQLに対する命令)がこちらです ↓
User Exists? (0.6ms) SELECT 1 AS one FROM `users` WHERE `users`.`age` = 24 LIMIT 1
=> true
それでは、pluckメソッドを使うとどうなるのでしょうか?
User.pluck(:age).include?(24)
↓ 発行されるクエリ(SQLに対する命令)がこちら ↓
(0.5ms) SELECT `users`.`age` FROM `users`
=> true
明らかに短いのがお分かりでしょうか?
処理にかかる時間も、0.1ミリ秒違います。
前者では、「24歳のユーザーが存在するかどうか」を調べているのに対し、
後者は「ユーザーの年齢の中に24歳のデータがあるかどうか」を調べています。
つまりpluckを用いることで、
__必要なカラムのみを取得できるため、クエリが短くなり、処理が早くなる__ということです。
データが増えれば増えるほど、処理速度の差は開きます。
「ポートフォリオを作ったけど、なんだか処理がもっさりしてるな…」という方は、データ取得の記述を見直してみてはいかがでしょうか?
##まとめ
①pluckメソッドは、__「あるカラムの値を配列で取得する」__メソッド
②pluckを使うことで、場合によっては無駄なクエリの発行を押さえ、処理速度が向上する
少しでもpluckメソッドの良さが伝わっていれば幸いです…
最後までご覧いただき、ありがとうございました。