0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ancestoryを使ってカテゴリー機能を実装

Posted at

はじめに

某プログラミングスクールに通いフリマアプリをチームで作成した際にカテゴリーの多階層構造の実装をしたので紹介します!!

完成図

Image from Gyazo

それでは紹介したいと思います。

#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ではこのように登録されます。

Image from Gyazo

最後まで見て頂きありがとうございます!!

この記事が少しでも参考になれば嬉しいです:pray_tone2:

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?