【Rails】ancestryを用いたカテゴリー機能の実装
おはようございます。
今日はコロナの影響で本業が休業で平日の昼間からブログを書いております。
ほんとはやく収まってほしいですね。
今日はancestryを用いたカテゴリー機能の実装についてメモしていきたいと思います。
実装したいこと
親カテゴリー:メンズ、レディース、ベビー・キッズ etc...
子カテゴリー:トップス、ジャケット/アウター、パンツ etc...
孫カテゴリー:Tシャツ/カットソー(半袖/袖なし)、Tシャツ/カットソー(七分/長袖)、シャツ/ブラウス(半袖/袖なし) etc...
のように、それぞれの親カテゴリーに対応する子カテゴリー、孫カテゴリーをつくり関係性をもたせるのが目的です。
これらをancestryのgemを用いて実装していきます。
ancestryを導入すると
ancestryを導入すると、どうやって親カテゴリーと小カテゴリーは紐付けられるのか。
それは基のカテゴリーテーブルにancestryカラムが追加され、関係性を示す数字が入れられます。
id | name | ancestry |
---|---|---|
1 | メンズ | NULL |
2 | トップス | 1 |
3 | Tシャツ/カットソー(半袖/袖なし) | 1/2 |
親カテゴリーであるメンズにはancestyはNULLが、子カテゴリーであるトップスにはancestryが1が、孫カテゴリーであるTシャツ/カットソー(半袖/袖なし)にはancestryが1/2が入っているのが分かります。
これで紐付いているのが理解できましたか?
メンズの小カテゴリーを取得したければ、ancestryカラムが1であるものすべてを引っ張ってこればいい訳です。
孫カテゴリーでも同様のことが言えます。
ancestryのgemにはそのようなメソッドがデフォルトで準備されているので、簡単取得できるので便利すぎるGemという訳です。
ancestryの実装
ancestryを使うための準備
ancestryの便利さは分かってもらえたと思うので、実際に実装の方へ移りましょう。
準備の流れ
1,categoriesテーブルの作成
2,ancestryのgem作成
3,categoriesテーブルにancestryのカラム作成
4,Categoryモデルにancestryを使うこととItemsテーブルとのアソシエーションを記載
5,itemsテーブルにcategoriesテーブルとのアソシエーションを追記
1, まずはカテゴリーテーブルを作成しましょう。
ターミナル
$ rails g model category
実行すると、マイグレーションファイルが作成されるので、下のように書き換えましょう。
マイグレーションファイル
class CreateCategories < ActiveRecord::Migration[5.0] def change create_table :categories do |t| t.text :name t.timestamps end end end
ターミナル
$ rails db:migration
これで、下表のようなcategoriesテーブルができます。
id | name |
---|---|
主キー | カテゴリー名 |
2, ancestryのgem作成
次にancestryのgemを作成します。
Gemfile
gem 'ancestry'
ターミナル
$ bundle install
これでancestry導入完了です。
3, categoriesテーブルにancestryのカラム作成
先程作ったcategoriesテーブルにancestryのカラムを作成します。
このままコピペで大丈夫です。(ancestryのREADMEにある書き方そのままです)
ターミナル
$ rails g migration add_ancestry_to_category ancestry:string:index
すると、下のようなマイグレーションファイルが作られます。
マイグレーションファイル
class AddAncestryToCategory < ActiveRecord::Migration[5.0] def change add_column :categories, :ancestry, :string add_index :categories, :ancestry end end
マイグレーションしてカラムの作成は終了です。
ターミナル
$ rails db:migrate
4, Categoryモデルにancestryを使うこととItemsテーブルとのアソシエーションを記載
準備完了までもう少しです。Categoryモデルを開き、アソシエーションを記載します。
Categoryモデル
class Category < ApplicationRecord has_many :items has_ancestry end
5, itemsテーブルにcategoriesテーブルとのアソシエーションを追記
itemsテーブル
belongs_to :category
終わり!!
以上でancestry導入の下準備は終了になります。
次回ではカテゴリー情報をデータベースに登録するまでを解説します。
お役に立ったという方はいいねを、なんかここ違うぞという方はコメント頂けるとうれしいです!
ここまで読んでいただきありがとうございました。では!