以下の時に用いる。
・最低限のデータを事前に投入しておきたいとき
・掲示板に関する動きを検証したい場合
やり方としてはrails db:seed のコマンドを打つと
db/seeds.rbの中に初期データをDBにインサートする処理を書いておけば
コマンド一つで初期データがDBに投入される。
<投稿一覧を表示する流れ>
① boardsテーブルからallメソッドを使い全データを取得
② 投稿内容に投稿したユーザーの名前を表示したいためusersテーブルからデータを取得
eachメソッドが①,②の作業を繰り返す。
(もし投稿が5個あれば5回、100万個あれば100万回繰り返す。)
つまり投稿がN個あればN回SQLが実行されるので、全てのレコードを取得する1回+N回SQLが実行されると表現できる。これをN+1問題と呼ぶ。
<対処法>
下記のようにincludesメソッドを使いアソシエーションの関連付けを事前に取得する。
boards_controller.rb
class BoardsController < ApplicationController
def index
@boards = Board.all.includes(:user).order(created_at: :desc)
#Board.allでboardsテーブルの全データを取得
#includes(:user)で関連するusersテーブルのデータも同時に取得
#order(created_at: :desc)で作成時間順に並べ替える
end
end
seeds.rb
10.times do #userのダミーデータ作成
User.create!(
first_name: Faker::Name.first_name, #Fakerの文法は参考のfaker github/usage
last_name: Faker::Name.last_name,
email: Faker::Internet.email,
password: '12345678',
password_confirmation: '12345678'
)
end
10.times do |index| #boardダミーデータ作成
Board.create!(
user: User.offset(rand(User.count)).first, #ユーザー指定
title: "タイトル#{index}",
body: "本文#{index}"
)
end