n+1問題(確認方法)
今回調べた限りでは2パターンあるよう。
①rails s をしてサーバーを立ち上げてコンソールで確認するパターン。
パッと見でもN+1問題が起こっていると、明らかに分量が多いのでわかる。
②Gemファイルを導入して確かめる方法
bulletというgemファイルを導入する方法がある様子。
今回はコンソールだけで確かめられたので、折を見て試してみる。
外部キー制約
<外部キー制約とは>
データベース側の項目に付ける制限
好きに値を入れられないようになっており、別テーブルの項目から値を選んで入れるように指定する。
今回の場合はuserテーブルとboardテーブルが依存関係にある。
FOREIGN KEY 制約の設定は子テーブル側で行う。
なので、今回は子テーブルである、db/migrate下のxxxx_create_boards.rb
にforeign_key: trueを記載する。
参考にした資料
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に必要事項を記載する
以下のように記載して、ページに埋め込んで呼び出せるようにする。
②埋め込みたいページに以下を記載して、実際に埋め込む
今回は埋め込みたい場所がerbファイルなので、ヘルパーメソッドを用いている。
③application.rbに日本時間を設定する
N+1問題の解決
N+1問題とは
N+1問題は解決すれば、1回のアクセスで取ってこられるデータを何度もアクセスして取ってくる、非効率的な状態。
今回の課題では、1人のuserに対し、複数の投稿(今回はboard)があるため、1人のuserの投稿を一気に複数取ってくることで、データベースへのアクセス回数を減らすことができる。
その対策が以下↓
app/controllers/boards_controller.rb
データを取得するコードに、includes(:user)を追記して、
とする。
Fakerを用いたダミーデータの作成
掲示板一覧を作成するにあったって、ダミーデータを使用するため。
大まかな流れ
♡Fakerを導入
♡db/seedsに内容を記載
♡DBをリセット、作成
①Fakerのインストール
Gemfileに
を記載し、bundle installする。
②db/seedsに内容を記載
を記載する。
③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を分かりやすく解説