3
6

More than 3 years have passed since last update.

ancestryにてカテゴリー機能実装後の表示方法について

Posted at

はじめに

某フリーマーケットサイトのクローンを開発中に
ancestryで作成したカテゴリーをデータベースに保存する事はできたのですが、
いざ詳細画面に表示しよう!

これが意外に難しい。。。。

色々調べたのですが、ドンピシャの記事がなかったので忘備録として載せておきます。

やりたいこと

出品時に保存したカテゴリーの値を商品詳細画面にて表示させたい。
スクリーンショット 2020-04-11 21.40.32.png

データベース

スクリーンショット 2020-04-12 18.46.07.png

試したコード

最初に試したコードがこちら

products_controller.rb
def show
    @product = Product.find(params[:id])
end
show.html.haml
= @product.category_id.name

nameが分からないとエラーが出てしまいました。
スクリーンショット 2020-04-12 18.48.47.png

やはり一筋縄ではいかなかったようです。。。
そもそも、ancestryを深く理解できていなかったので、本当に保存できているのか不安でした(笑)

とりあえず全ての値を取り出せるか試してみようと思いコントローラーに@parentsを追加。

products_controller.rb
def show
    @product = Product.find(params[:id])
    @parents = Category.all.order("id ASC").limit(607) #limitの数値はテーブルに入っているIDの最大値です。
end
show.html.haml
- @parents.each do |parent| #eachで全てを取り出す。
  = parent.name

スクリーンショット 2020-04-12 19.08.15.png

とりあえず全てを取り出すことに成功!!
ここから、出品された商品のcategory_id(今回は589)と結びつける必要があります。
そこで、ifを使い、

show.html.haml
- @parents.each do |parent| #eachで全てを取り出す。
  - if @product.category_id == parent.id #取り出したIDと商品のIDが同じ物を表示
    = parent.name

スクリーンショット 2020-04-12 19.17.42.png
孫カテゴリーの名前を取り出すことに成功!
ここまできたらもう一息!!!

show.html.haml
- @parents.each do |parent|
  - if @product.category_id == parent.id
    = link_to "#" do
      = parent.parent.parent.name #親カテゴリー
      %br
    = link_to "#" do
      = parent.parent.name #子カテゴリー
      %br
    = link_to "#" do
      = parent.name #孫カテゴリー

スクリーンショット 2020-04-12 19.25.16.png
無事に3つのカテゴリーを表示することに成功しました!!

コード自体は単純で孫カテゴリーに.parentをつけることで、ひとつ上の階層にあるカテゴリー名(子カテゴリー)を取り出し、更に.parent.parentとすることで親カテゴリーを取り出すという仕組みです。

まとめ

終わってみると案外シンプル。
しかし、私はこれを表示するのに2時間近く奮闘していました(笑)

もっと簡単な方法もたくさんあるとは思いますが、
自分はこれで実装ができたので、少しでも誰かの手助けになれば嬉しいです。

3
6
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
3
6