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


はじめに

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

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

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

やりたいこと

出品時に保存したカテゴリーの値を商品詳細画面にて表示させたい。

データベース

試したコード

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

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

nameが分からないとエラーが出てしまいました。

やはり一筋縄ではいかなかったようです。。。
そもそも、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

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

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


孫カテゴリーの名前を取り出すことに成功!
ここまできたらもう一息!!!

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 #孫カテゴリー


無事に3つのカテゴリーを表示することに成功しました!!

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

まとめ

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

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