生活の知恵があつまる情報サイト

nanapi

Icon businessビジネス・経済

  1.  
  2.  
  3. 【nanapi TECHBLOG】Awesome nested setの使い方

【nanapi TECHBLOG】Awesome nested setの使い方

2016年11月09日作成

 views

nanapi.jpには約19,000の記事カテゴリがあり、1つの記事はそのいずれかカテゴリに属すようになっています。

記事カテゴリは、パソコンのフォルダのようなツリー構造になっていて、最上位の階層には現在19個のカテゴリ(恋愛、料理、妊娠、育児など)があります。19個のカテゴリツリーは、MySQLの1つのテーブルに入っています。

今回は、nanapi.jpの記事カテゴリデータの操作に使っているRubyのgem、Awesome nested setの使い方について紹介します。

筆者:violetyk
作成日時:2015/01/14

目次

データベースでツリー構造を実現するアルゴリズム

データを格納しているMySQLなどのRDBはExcelのような行列による表形式でデータを取り扱う仕組みなので、ツリー構造を持つためには工夫が必要です。ツリー構造を表現するアルゴリズムの1つとしてNested Sets Model(入れ子集合モデル)があります。

  • 入れ子集合モデルについての参考URL

Nested Sets Modelを扱うライブラリ

Nested Sets Model形式のテーブルをWebアプリケーションが透過的にツリー構造として扱うことができるライブラリはいろいろあります。CakePHPのCoreライブラリに入っているTreeBehavior、RubygemだとAncestryAwesome nested setです。

2014年10月〜12月でnanapiの裏側をCakePHPからRailsへすべて書き直したのですが、Railsへ移行するにあたり記事カテゴリを扱うのにActiveRecordPluginのAwesome nested setを使うようにしました。The Ruby Toolboxの ActiveRecord Nestingのなかでダウンロード数の多かったのが理由です。

Awesome nested setの使い方

Gemfile: に gem “awesome_nested_set” を追加してインストール。

ツリー構造の取得

判定

移動

追加されるコールバック

CakePHP TreeBehaviorからの移行

ツリー構造のテーブルがcategoriesとして、既にCakePHPのTreeBehaviorを使うためにid, lft、rght, parent_idがある状態から、次の流れで行いました。

  • created、modifiedをそれぞれcreated_at、updated_atに変更
  • 新たにdepthというカラムを追加
  • parent_idがゼロ(最上位カテゴリ)のものはnilに更新
  • テーブルのレコードをすべてsaveして、depthに値を入れる

マイグレーション

モデルにカラム情報を設定

使い勝手が良くて便利!

Awesome nested setの使い方を紹介しました。ツリー構造を操作するためのメソッドがひととおり揃っていて使い勝手が良くとても便利です。

(image byc 筆者)

この記事で使われている画像一覧

  • F30d6e71 b4ed 476d 953f 88b74f82942b
  • 0f0c3768 13eb 4080 aaa9 1007d4ed0fe6
  • 4151299e 685c 4b9e 991c 910b039a1463
  • B325b2e9 b43f 4185 a96d 7af99c792752
  • Ccf701d1 8664 40a1 b25b 9ac2075aa476
  • 66572f07 c69b 4b19 9733 a07b1a05ceb5
  • 6211c9e2 cbae 4577 91e0 8df159507387

本記事は、2016年11月09日時点の情報です。記事内容の実施は、ご自身の責任のもと安全性・有用性を考慮してご利用いただくようお願い致します。

編集部ピックアップ

編集部おすすめ期間限定のPRコンテンツ

もっと見る