ancestryで楽にカテゴリ分けをしよう

こんにちは。

GMOアドマーケティングのR.Sです。

 

今回はActiveRecordのモデルをツリー構造で整理できるようにする「ancestry」というgemを紹介します。

親子孫ひ孫のような多階層構造が簡単に実装できるので、カテゴリ分けなどに利用できます。

 

動作環境

  • Ruby 2.4.4

  • Rails 5.2.4

  • ancestry 3.2.1

 

gemインストール

$ bundle install

 

テーブル作成

まずモデルを作成して

$ bundle exec rails g model Category

ancestryカラムを含むようにマイグレーションファイルを編集、

マイグレーション実行。

bundle exec rake db:migrate

モデルを下記のように編集します。

has_ancestryを追記することでancestryが有効になりました。

 

データの投入

今回はこちらの記事を参考にseedファイルを作成してデータを投入しました。

ancestryカラムがnullのレコードはツリーでいうroot(一番上の親)にあたります。

子は1、孫は1/2というように/で区切られて階層が表現されるので、ID5のファンデーションの親はID2の化粧品、ID2の化粧品の親はID1の美容という経路で追うことができます。

下図のように、ひ孫を設定することも可能です。

 

メソッドの活用

ancestryを使うメリットとして、メソッドが豊富に用意されていることが挙げられます。

公式ドキュメントにツリー構造の図と共に記載してあります。丸で囲まれたノードから黄色のノードを得ることができます。

 

コンソールを起動してメソッドを使用してみます。

 

 

 

まとめ

ancestryを使うことで、ものすごく簡単にカテゴリ分けをすることができました。

経路がancestryというひとつのカラムに集約しているため、頻繁に経路が変わるものには使いづらいというデメリットもあります。

とはいえ、親から見た子にあたるレコードを全て取得できたり、孫やひ孫からも親をすぐ辿れるメソッドが用意されているメリットは大きいと思いました。