【結論】includesを使う
データベースにアクセスする回数を減らそう
データを取ってくる際にSQLというものが発行されます。
アソシエーションを組んでいる場合、子要素のデータを取ってくる時もあるでしょう。
例えばこんな時
index.html.haml
- @tweets.each do |tweet|
= tweet.text
= tweet.user.nickname
tweetsテーブルとusersテーブルからデータを取ってきてます
この時SQLは通常(tweetsテーブル)+1回(usersテーブル)発行されてしまいます。
SQLが多いと処理が重くなるので、1回で関連するデータを一気に持ってきちゃおうぜ!って話です。
UserモデルとTweetモデルが以下のアソシエーションを組んでいるとします。
user.rb
has_many :tweets
tweet.rb
belongs_to :user
【tweetsコントローラーを編集】
includes (:モデル名)
これで一気に関連データまで取ってくることができます。
tweets_controller.rb
def index
@tweets = Tweet.includes(:user) #allは省略可
end
これでN+1問題はバッチリ解決です!
ではまた!