シードファイル

以下の時に用いる。

・最低限のデータを事前に投入しておきたいとき
・掲示板に関する動きを検証したい場合

やり方としてはrails db:seed  のコマンドを打つと db/seeds.rbの中に初期データをDBにインサートする処理を書いておけば

コマンド一つで初期データがDBに投入される。

N+1問題

<投稿一覧を表示する流れ>

① 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

〜Fakeとseedを使いダミーデータを作成〜

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