n+1問題(確認方法)

今回調べた限りでは2パターンあるよう。

 

rails s をしてサーバーを立ち上げてコンソールで確認するパターン。

 

パッと見でもN+1問題が起こっていると、明らかに分量が多いのでわかる。

 

②Gemファイルを導入して確かめる方法

 

bulletというgemファイルを導入する方法がある様子。

今回はコンソールだけで確かめられたので、折を見て試してみる。

 

 

外部キー制約

 

<外部キー制約とは>

データベース側の項目に付ける制限

好きに値を入れられないようになっており、別テーブルの項目から値を選んで入れるように指定する。

 

 

今回の場合はuserテーブルとboardテーブルが依存関係にある。

FOREIGN KEY 制約の設定は子テーブル側で行う。

なので、今回は子テーブルである、db/migrate下のxxxx_create_boards.rb

foreign_key: trueを記載する。

 

def change
create_table :boards do |t|
t.string :title, null: false
t.text :body, null: false
t.references :user, foreign_key: true, null: false

t.timestamps
end
end

 

 

参考にした資料

https://dev.mysql.com/doc/refman/5.6/ja/create-table-foreign-keys.html

 

 

i18nを用いた時間表記(日本時間)

掲示板の投稿時刻を日本時間で表示するため、i18nを用いる。

以前、i18nは導入済みなため、日本時間を表示するための手順のみ記載する。

 

 

<手順>

♡ya.ymlに必要事項を記載する

♡表記したいページに埋め込む

♡config/locales/application.rbに日本時間の設定をする

 

①ya.ymlに必要事項を記載する

以下のように記載して、ページに埋め込んで呼び出せるようにする。

date:
formats:
default: "%Y/%m/%d"

②埋め込みたいページに以下を記載して、実際に埋め込む

<%= l board.created_at, format: :default %>

 今回は埋め込みたい場所がerbファイルなので、ヘルパーメソッドを用いている。

 

③application.rbに日本時間を設定する

config.time_zone = 'Tokyo'
config.active_record.default_timezone = :local

 

 

 

 
 
 

N+1問題の解決

N+1問題とは

N+1問題は解決すれば、1回のアクセスで取ってこられるデータを何度もアクセスして取ってくる、非効率的な状態。

 

今回の課題では、1人のuserに対し、複数の投稿(今回はboard)があるため、1人のuserの投稿を一気に複数取ってくることで、データベースへのアクセス回数を減らすことができる。

 

その対策が以下↓

app/controllers/boards_controller.rb

データを取得するコードに、includes(:user)を追記して、

def index
@boards = Board.all.includes(:user)
end

とする。

 

 

 

 

Fakerを用いたダミーデータの作成

掲示板一覧を作成するにあったって、ダミーデータを使用するため。

大まかな流れ

♡Fakerを導入

♡db/seedsに内容を記載

♡DBをリセット、作成

①Fakerのインストール

Gemfileに

gem 'faker'

を記載し、bundle installする。

②db/seedsに内容を記載

20.times do
User.create!(
first_name: Faker::Name.first_name,
last_name: Faker::Name.last_name,
email: Faker::Internet.email,
password: '12345678',
password_confirmation: '12345678'
)
end

20.times do |index|
Board.create!(
user: User.offset(rand(User.count)).first,
title: "タイトル#{index}",
body: "本文#{index}"
)
end

を記載する。

③DBをリセットして、実際にダミーデータを作成する

rails db:reset でデータを全てリセットして、

rails db:seed で作成する

 

 

掲示板の一覧機能のモデル作成・編集

<大まかな流れ>

♡モデルファイルの作成

♡モデルファイルの中身の編集

♡親モデル、子モデルを結びつける

♡モデルに記載するRails側の制限を記載する

 

①モデルファイルを作成する

rails g model Board title:string body:text

でmodel下にborad.rbファイルを作成する。

stringは1~255の文字列

textは1〜4294967296の文字列の場合に用いる。

 

 

②モデルファイルの中身を作成する

class Book < ApplicationRecord

end

はすでに記載されている状態になるので、中身を作っていく。

1人のユーザーに対し複数の投稿がある1対多の関係になる。そのことを踏まえて、user.rbとboard.rbを結びつけていく。

親モデルである、user.rbにhas_many :boardsを記載する。

次に、

子モデルである、board.rbにbelongs_to :userを記載する。

 

 

③ユーザーを削除した場合、boradsの内容も消えるようにする

user.rbのhas_many :boardsの後に、dependent: :destroyを追記し、

has_many :boards, dependent: :destroyとすることで、

親モデルを消した場合、子モデルも削除する=ユーザーを削除することでboardsも全て削除できる状態にする。

 

 

Rails側にかける制限を書いていく

タイトル(title)を250文字以内

内容(body)を10000文字以内に収めるよう制限を設ける場合、

タイトルについては、

validates :title, presence: true, length: { maximum: 250 }

内容については、

validates :body, presence: true, length: { maximum: 10_000 }

とすることで、Rails側の制限をかけることができる。

制限をかける文字数が1000を超えた場合、3桁のところで「_」を挟む(10_000)のように。

iT用語集

知らないIT用語が飛び交っているので、メモとして残します。

 

♡ラップするラッピング

 あるクラスの関数、データ型などが提供する機能やデータを含み、別の形で提供すること。

 用意されたクラスや関数を「ラッパー」(wrapper)という。 

 参考文献:ラップ(ラッピング)とは - IT用語辞典 e-Words

 

プレゼンテーション層

 異なる文字コードを使用していると、文字化けが発生してしまう。

 コンピュータ間で文字コードを統一することで解決することができる。

 画像や音楽についても、データ形式を統一する必要がある。データの暗号や復号も担当。

 参考文献:【OSI参照モデル】プレゼンテーション層とは - ITを分かりやすく解説