Breaking News

Default Placeholder Default Placeholder

前回の記事で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`を使っていきましょう!