Railsで階層構造を簡単に作ってみる
何をやるか
Railsのgemと言うモジュールの中に「awesome_nested_set」と言う
ツリー構造を自動生成してくれる機能があります。
ツリー構造を自動生成してくれる機能があります。
カテゴリなど動的に変動し
親子関係の生じるものに使い勝手が良さそうなので導入例を記します。
何が出来るか
- 動的にツリー構造の上下関係を作成出来る
- 親子関係を動的に追加、編集出来る
- 親または子、及び同列の兄弟の要素を取得出来る
- 要素自体の深さ(階層)を調べられる (rootは0)
- 葉要素(ツリーの末端)を取得出来る
導入方法
Gemfileに以下を追記。
1 | gem 'awesome_nested_set' |
追記したgemをインストール
1 | bundle install |
ツリー構造を持たせるスキーマを適当に作成しておく
1 | rails g scaffold Category name: string |
上記で作成したスキーマにツリー構造を持たせる
1 | rails g migration add_awesome_nested_set_columns_to_categories parent_id:integer lft:integer rgt:integer |
作成されたmigrateファイルを以下のように編集し、拡張させる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class AddAwesomeNestedSetColumnsToCategories < ActiveRecord::Migration def change # 必須のフィールド add_column :categories, :parent_id, :integer add_column :categories, :lft, :integer add_column :categories, :rgt, :integer add_index :categories, :parent_id add_index :categories, :lft add_index :categories, :rgt # オプションのフィールド add_column :categories, :depth, :integer add_column :categories, :children_count, :integer add_index :categories, :depth end end |
Categoryのモデルにツリー構造である宣言を以下一行付け足す
1 2 3 | class Category < ActiveRecord::Base acts_as_nested_set end |
migrationをスキーマに反映
1 | bundle exec rake db:migrate |
色々ノードを作成してみる
今回はビューとコントローラの連携が間に合わずコンソール(コマンド)にて割愛.
1 2 | # 最上位要素を作成 root = Category.create(name: 'root') |
1 2 3 | # 子要素を2つ追加してみる child_one = root.children.create(name: 'child_one') child_two = root.children.create(name: 'child_two') |
1 2 | # 更に子(rootの孫)を作成してみる grand_child_one = child_one.children.create(name: 'grand_child_one') |
1 2 | # 葉要素を取得 root.leaves |
1 2 | # 兄弟要素を取得 child_one.siblings |
1 2 | # 階層を取得 child_one.level |
1 2 | # 孫要素の親を変更する grand_child_one.move_to_child_of(child_two) |
Author Profile
スターフィールド編集部
SHARE