所有するコスメの使用期限を管理するアプリを作成中です。
初めてのオリジナルアプリということでわからないことだらけの実装のため、備忘録として記録していこうと思います。
はじめに
大分類のカテゴリー(4種類)、小分類のカテゴリー(24種類)とで大きく2つに分けていますが、
カテゴリーを扱うにあたってActive_Hash
1を使用しました。
課題
登録したコスメを大分類カテゴリーごと且つ新しい順に表示させるのに
特定のカテゴリーで登録されたデータのみ取得するにはどうしたらいいんだっけ?
カテゴリーの取得
調べたところ、whereメソッド
2に辿り着きました。(すっかり忘れてました・・・)
class ItemsController < ApplicationController
def index
category_face = Item.where(category_id: 2)
category_eye = Item.where(category_id: 3)
category_lip = Item.where(category_id: 4)
end
※catgory_id: 1
は初期値として「---」を設定しており、
初期値では保存ができないようバリデーションしているので、初期値に対しての記述は不要。
登録が新しい順に並べる
orderメソッド3がありますが、一覧ページにはユーザーページに遷移するリンクも設定するので、
このままではN+1問題4が発生するため、includesメソッド5を使用します。
@post_face = category_face.includes(:user).order("created_at DESC")
カテゴリーごと且つ新しい順に取得する
最終的に記述したのがこちら!
def index
category_face = Item.where(category_id: 2)
@post_face = category_face.includes(:user).order("created_at DESC")
category_eye = Item.where(category_id: 3)
@post_eye = category_eye.includes(:user).order("created_at DESC")
category_lip = Item.where(category_id: 4)
@post_lip = category_face.includes(:user).order("created_at DESC")
end
-
Active_Hash
変更されないデータをモデルファイルに直接記述することで
データベースに保存せずに取り扱うことができるGem。 ↩ -
whereメソッド
引数部分に条件を指定することで条件に一致したレコードのみ取得することができる。 ↩ -
orderメソッド
テーブルから取得した複数のレコードの並び順を変更することができる。 ↩ -
N+1問題
アソシエーションを利用した場合に限り、データベースへのアクセス回数が多くなる問題のこと。
今回の場合、複数のコスメが存在する一覧ページで、それぞれユーザー名を表示させると、
items
に関連するusers
情報の取得にコスメ数と同じ数だけアクセスが必要になり、
アプリのパフォーマンスが著しく下がる。 ↩ -
includesメソッド
引数に指定された関連モデルを1度のアクセスでまとめて取得できる。 ↩