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はとれないしね。