【今日のgem】ツリー構造を扱うときは、「ancestry」が便利です
テクノロジー
Organise ActiveRecord model into a tree structure
ActiveRecordモデルで階層(ツリー)構造を扱うことができるgemです。
# Gemfile
gem 'ancestry'
# データベースに階層構造を記述するためのカラムとインデックスを追加します
# migrateファイル作成
rails g migration add_ancestry_to_[table] ancestry:string
# インデックスの追加を記載
add_index [table], :ancestry
# migrate実行
rake db:migrate
# modelクラスに設定追加
# app/models/[model].rb
has_ancestry
以下のようなメソッドで、 ancestors, parent, root, children, siblings, descendantsといった、 ツリー構造の標準的な関連データにアクセスできます。
parent: 親ノードのレコードを返す
root: ルートノードのレコードを返す
children: 子ノードのレコードを返す
depth: 階層の深さを数値で返す
など
ちなみに、データベースのカラムには以下のようにパスが保存されます
| id | ancestry |
| -- | ---------- |
| 6 | NULL |
| 7 | 6 |
| 8 | 6/7 |