0
0

More than 1 year has passed since last update.

カテゴリーごとの一覧表示

Posted at

所有するコスメの使用期限を管理するアプリを作成中です。
初めてのオリジナルアプリということでわからないことだらけの実装のため、備忘録として記録していこうと思います。

はじめに

大分類のカテゴリー(4種類)、小分類のカテゴリー(24種類)とで大きく2つに分けていますが、
カテゴリーを扱うにあたってActive_Hash1を使用しました。

課題

登録したコスメを大分類カテゴリーごと且つ新しい順に表示させるのに
特定のカテゴリーで登録されたデータのみ取得するにはどうしたらいいんだっけ?

カテゴリーの取得

調べたところ、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

あとはビューを作成して完成
Image from Gyazo

  1. Active_Hash
    変更されないデータをモデルファイルに直接記述することで
    データベースに保存せずに取り扱うことができるGem。

  2. whereメソッド
    引数部分に条件を指定することで条件に一致したレコードのみ取得することができる。

  3. orderメソッド
    テーブルから取得した複数のレコードの並び順を変更することができる。

  4. N+1問題
    アソシエーションを利用した場合に限り、データベースへのアクセス回数が多くなる問題のこと。
    今回の場合、複数のコスメが存在する一覧ページで、それぞれユーザー名を表示させると、
    itemsに関連するusers情報の取得にコスメ数と同じ数だけアクセスが必要になり、
    アプリのパフォーマンスが著しく下がる。

  5. includesメソッド
    引数に指定された関連モデルを1度のアクセスでまとめて取得できる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0