はじめに
某プログラミングスクールに通いフリマアプリをチームで作成した際にカテゴリーの多階層構造の実装をしたので紹介します!!
完成図
それでは紹介したいと思います。
#1.モデルの作成
まず商品とカテゴリーを紐付けさせたいので『category』と『item』のモデルを作成します。
$ rails g model category
$ rails g model item
#2.ancestoryの導入
Gemfileにancestoryを導入します。
gem 'ancestry'
ターミナルで下記コマンドを実行
$ bundle install
$ rails g migration add_ancestry_to_category ancestry:string:index
$ rails db:migrate
3.アソシエーション
ancestoryを使うことで多対多の関係が1対多の関係になりDB設計がシンプルになります。
category.rbにhas_ancestoryを記述
category.rb
class Category < ApplicationRecord
has_many :items
has_ancestry
end
item.rb
class Item < ApplicationRecord
belongs_to :category
end
#3.データを導入
seeds.rbにカテゴリーのレコードを導入していきます。
seeds.rb
lady = Category.create(name: "レディース")
lady_1 = lady.children.create(name: "トップス")
lady_1.children.create([{name: "Tシャツ/カットソー(半袖/袖なし)"},{name: "Tシャツ/カットソー(七分/長袖)"},{name: "シャツ/ブラウス(半袖/袖なし)"},{name: "シャツ/ブラウス(七分/長袖)"},{name: "ポロシャツ"},{name: "キャミソール"},{name: "タンクトップ"},{name: "ホルターネック"},{name: "ニット/セーター"},{name: "チュニック"},{name: "カーディガン/ボレロ"},{name: "アンサンブル"},{name: "ベスト/ジレ"},{name: "パーカー"},{name: "トレーナー/スウェット"},{name: "ベアトップ/チューブトップ"},{name: "ジャージ"},{name: "その他"}])
ancestryを入れると.childrenと記述することで直前の変数の子要素として扱うことができます。
以下の記述で親カテゴリーであるレディースが登録されます。
seeds.rb
lady = Category.create(name: "レディース")
次に、以下の記述で子カテゴリーであるトップスが登録されます。
seeds.rb
lady_1 = lady.children.create(name: "トップス")
そして、以下の記述で孫カテゴリー群が登録されます。
seeds.rb
lady_1.children.create([{name: "Tシャツ/カットソー(半袖/袖なし)"},{name: "Tシャツ/カットソー(七分/長袖)"},{name: "シャツ/ブラウス(半袖/袖なし)"},{name: "シャツ/ブラウス(七分/長袖)"},{name: "ポロシャツ"},{name: "キャミソール"},{name: "タンクトップ"},{name: "ホルターネック"},{name: "ニット/セーター"},{name: "チュニック"},{name: "カーディガン/ボレロ"},{name: "アンサンブル"},{name: "ベスト/ジレ"},{name: "パーカー"},{name: "トレーナー/スウェット"},{name: "ベアトップ/チューブトップ"},{name: "ジャージ"},{name: "その他"}])
seeds.rb内にレコードを記述したら、ターミナルで以下のコマンドを実行しDBに反映させます。
$ rails db:seed
DBではこのように登録されます。
最後まで見て頂きありがとうございます!!
この記事が少しでも参考になれば嬉しいです