【Rails】ancestryを用いたカテゴリー機能の実装

おはようございます。

今日はコロナの影響で本業が休業で平日の昼間からブログを書いております。

ほんとはやく収まってほしいですね。


今日はancestryを用いたカテゴリー機能の実装についてメモしていきたいと思います。

開発環境

ruby のバージョン 2.5.1
rails のバージョン 5.0.7

実装したいこと

親カテゴリー:メンズ、レディース、ベビー・キッズ 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導入の下準備は終了になります。



次回ではカテゴリー情報をデータベースに登録するまでを解説します。

お役に立ったという方はいいねを、なんかここ違うぞという方はコメント頂けるとうれしいです!

ここまで読んでいただきありがとうございました。では!