前提条件
以下のことが終わっていることとする。終わっていないと機能が正しくなっているか確認が難しい。
・ancestryを用いてカテゴリーテーブルを作成している。
・カテゴリー:商品 = 1:多の関係になっている。
・カテゴリーの階層が3段階になっておりそれぞれの命名が「親」、「子」、「孫」になっている
・商品モデルのcategory_idには、最下層のカテゴリーidが登録されている。
・gem kaminariがインストール済
・カテゴリーコントローラーファイルの作成及び、カテゴリーの取得ができるコードが書かれている。
#カテゴリー別に商品一覧を表示させる
カテゴリーの詳細が見たいわけなのでshowアクションを用います。
###showアクション定義
app/controllers/categories_controller.rb
before_action :set_category, only: :show
def show
@items = @category.set_items
@items = @items.where(buyer_id: nil).order("created_at DESC").page(params[:page]).per(9)
end
private
def set_category
@category = Category.find(params[:id])
end
###モデルメソッド定義
app/models/category.rb
has_many :items
has_ancestry
def set_items
# 親カテゴリーだった場合
if self.root?
start_id = self.indirects.first.id
end_id = self.indirects.last.id
items = Item.where(category_id: start_id..end_id)
return items
# 子カテゴリーだった場合
elsif self.has_children?
start_id = self.children.first.id
end_id = self.children.last.id
items = Item.where(category_id: start_id..end_id)
return items
# 孫カテゴリーだった場合
else
return self.items
end
end
@items = @category.items と記述するだけでは、
商品モデルのcategory_idには最下層のidが付与されているので@categoryが孫であった場合のみ、情報が取得されることになってしまう。
なので予め、上記のようにカテゴリーが親なのか子なのか孫なのかといったような条件分岐をするとうまくいくはず
###ビュー
app/views/categories/show.html.haml
.items-container
.items-index
.title
= "#{@category.name}の商品一覧"
.title__border
- if @items
%ul.lists
= render "items/item", items: @items
= paginate @items
このままでは他のカテゴリーへのリンクがまだ設定されていないが、
それはまた、書いていきます