Rails N + 1問題 他理解した点
22日目です。
昨日の「Railsで分からないところ」ですが、本日①、⑤、⑥が分かりました。
分からないところ
①n + 1問題を解決するためのincludeメソッドを使うタイミングが分からない(SQLを発行するという概念が分からない)
②idを引数として使った文がどのような論理になっているのかが分からない
③ルーティングのネストの論理構造が分からない
④routes.rbで「HTTPメソッド "/URL" => "コントローラー名#アクション名"」と記載されていると分かるが、resourcesが出てくると分からない
⑤「どのような場合にこのエラーメッセージがでる」ということを理解していないので、エラーの原因が分からない
⑥ビューファイル(html.erb)の構造や作り方が分からない
①N + 1問題とは
モデルを利用して(アソシエーションを利用して)DBの情報にアクセスする際は、SQLが発行される。SQLが発行されるたびにDBに通信が走るため、大量に発行されるとDBに負荷がかかってしまう。
データベースから、テーブルの全てのレコードを呼ぶ際、そのテーブルのレコードの数だけユーザー情報を呼び出す場合などに、全てのレコードの数+1回ずつSQL文が発行されてしまうことになる。これがN + 1問題という。
例:N + 1が発生してしまう時
@tweets.each do |tweet|
tweet.user.name
end
・@tweetsでテーブルを全て取得するときに、まず1回SQLが発行される(これで「1」)
・tweetを一回取得するごとに、userテーブルにnameカラムを探すSQLが発行される
(これが N + )
ネット上でどっちかというと1 + N問題と言う方が分かりやすいと言う意味が分かりました。
includeを使用した場合
def index
@tweets = Tweet.all.include(:user)
end
Tweet.allで全て取得する時にuserテーブルの情報も一度に持ってきてくれる。
これによってSQLの発行が2回に抑えられる
https://www.blackwatcher.net/entry/n-plus-1-problem
このサイトがどのようにSQL文が発行されているか解説してくれていて分かりやすかったです。
⑤エラー問題を8個ほど解いたので、少しではありますがエラーへのアレルギーがなくなりました。
特に「エラーがでた箇所を見て、どこが間違っているのか仮説を立ててから調べる」ことで余計に時間を取られずに済みました。
ルーティングエラーが出た際は、まずはルーティングに送られてきているHTTPメソッド、パス、コントローラーとアクションを確認し、そのあとリクエストを送ったビューファイルと照らし合わせることで、「ルーティングが見つからない」という状況を解決しやすかったです。
⑥全てを理解したわけではありませんが、下記のQiitaがとても分かりやすくまとめられており、ビューファイル構造の理解に役立ちました。同じスクールの在校生が書いた記事で、すごいと思います。
②、③、④については引き続き明日理解を進めていきます。
あと一つだけ、本日発生した疑問が解決したので備忘録として載せます。
コントローラーで変数に@がついている場合とついていない場合があるがなぜだろう?
と思ったのですが、これは「@をつけることでインスタンス変数になるが、インスタンス変数にしないとビューファイルで使えないから」「ビューファイルで使わないアクションに関しては、特にインスタンス変数にする必要はない」と言うことでした。
ーーーーーーーーーーーーーーーー
本日覚えたコマンド
option + commnd + i
明日はRailsの最後のカリキュラムを終わらせ、余裕があれば試験をときます。