LoginSignup
0
0

More than 3 years have passed since last update.

findに範囲をselectで指定してみたけど、意味あるのか?

Posted at

はじめに

先日の面談からずっとSQLを中心に勉強をしています。
今日勉強したことを自分のアプリケーションに生かしていました。
ただ、効果があるかは微妙です。

ユーザーのマイページを表示させるページへの遷移(コントローラー部分)

before

before
def show
  @user = User.find(params[:id])
end
SQL
SELECT `users`.*
FROM `users`
WHERE `users`.`id` = 2
LIMIT 1

usersテーブルの全てのカラムから検索している。

after

after
def show
  @user = User.select(:id, :nickname, :first_name, :last_name, :email).find(params[:id])
end

:id, :nickname, :first_name, :last_name, :emailはそのページで表示させるために必要だった情報です。

SQL
SELECT `users`.`id`, `users`.`nickname`, `users`.`first_name`, `users`.`last_name`, `users`.`email`
FROM `users`
WHERE `users`.`id` = 2
LIMIT 1

SQL文がとても長くなったが、エラーは起きず、
beforeと同じ動作はできました。

これだとエラー

error
def show
  @user = User.find(params[:id]).select(:id, :nickname, :first_name, :last_name, :email)
end

selectfindを入れ替えただけ。
「検索をかけてから、探す」

「探してから検索をかける」
では、意味が違うのだろう。

最後に

検証することもできないし、考える必要もないことかもしれないけど、
今回の変更で、多少でも速度や負担に変化はあるのだろうか?塵積も!?

afterの方がSQL文は長いけど、検索しているカラムは最小限だが…
でも、afterの方がコードも長いし…可読性に欠ける?

今回のことは、変化を感じることは少なかったけど、
SQLの勉強にはなりました。

0
0
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
0
0