前回の記事でRails6の開発環境を作ったのでいろいろと試しています。今回は新機能の `pick` を使ってみたいと思います。
pick
Rails6のActiveRecordの新機能の1つとして、 `pick`があります。
何ができるの?
`pick`を使うと、条件に最初に引っかかるレコードから指定したカラムのみを取得することができます。
あれ、それって .first と .pluck 使えば。。。
お気付きの方もいるかと思いますが、 `条件に最初に引っかかるレコードから指定したカラムのみを取得`はすでに既存の機能を使ってできます。
User.where(age: 10).pluck(:name).first
はい、これでOKですね。しかし、この場合だと `pick` を使ったほうが良いのです。
pickと .pluck.firstの違い
SQLが違う
.pluck.firstが作るSQL
SELECT `users`.`name` FROM `users` WHERE `users`.`age` = 10
.pickが作るSQL
まず `pick`の使い方
User.where(age: 10).pick(:name)
これで発行されるSQLは
SELECT `users`.`name` FROM `users` WHERE `users`.`age` = 10 LIMIT 1
そう、LIMITがついているのです。前者が条件のレコード全てを取ってくるのに対して後者は最初から1つのレコードのみを取得するようになっています。これは、条件に当てはまるレコード数が多ければ多いほど速度差が如実になります。
しかしながらこれだけだと `.limit(1)`つければいいじゃない、と思いますよね。
実は `.pick`が素晴らしいのは次の理由からなんです。
pick
ではレコードを取得した後のモデルクラスのインスタンス生成が行われません。つまり処理が速い、ということに直結します。
条件に当てはまるレコードの特定のカラムのみ取得したいときは `.pick`を使っていきましょう!