Railsメモ:自己参照で木構造なデータ構造にはacts_as_tree
ディレクトリ構造みたいな木構造をテーブルに自己参照させて作るとき、ActiveRecordのモデルを簡単にそれに対応させれるプラグイン。…こんなのあったんか、知らんかった、Rails 1.xのころは標準だったなんて。
こんなことが出来る。
# トップは外部キーがnull d = Directory.find_by_parent_id(nil).first # childrenで子が取れる d.children #=> [<Directory>, <Directory>] # parentで親が取れる d.children[0].parent #=> <Directory> == d # 同じ階層の自分以外 d.children[0].siblings #=> [<Directory>] # 親、親の親を辿ってトップまでを返す d.children[0].children[0].ancestors #=> [<Directory>, <Directory>]
Modelはこんな感じ
class Directory < ActiveRecord::Base acts_as_tree :order => "id" end
parent_idというフィールドを作るか:foreign_keyオプションで外部キーを指定する。
自分で書くと、↓みたいな。
belongs_to :parent, :class_name => "Directory", :foreign_key => "parent_id" has_many :children, :class_name => "Directory", :foreign_key => "parent_id"
ずっとこれでやってた俺涙目 > <
siblingとancestorsはとれないしね。