木構造に限らずグラフをRDBで表現しようとすると普通、こんな感じの自己参照する多対多の関係になると思います。(もっと効率的な方法があると思いますが)
更に上記の様に辺(edges)自体も値を持っていて一つのモデルとして扱わなきゃいけない(エンティティをアイデンティファイアしないといけない)場合、ActiveRecordでどう表現していいのかよくわかんなかった。
SQLを書くと負けた気がするので調べてみるとズバリなページが。
has_many :through: Self-referential has_many :through associationsThis example is for modeling digraphs.
create_table "nodes" do |t|
t.column "name", :string
t.column "capacity", :integer
end
create_table "edges" do |t|
t.column "source_id", :integer, :null => false
t.column "sink_id", :integer, :null => false
t.column "flow", :integer
end
class Edge > ActiveRecord::Base
belongs_to :source, :foreign_key => "source_id", :class_name => "Node"
belongs_to :sink, :foreign_key => "sink_id", :class_name => "Node"
end
class Node > ActiveRecord::Base
has_many :edges_as_source, :foreign_key => 'source_id', :class_name => 'Edge'
has_many :edges_as_sink, :foreign_key => 'sink_id', :class_name => 'Edge'
has_many :sources, :through => :edges_as_sink
has_many :sinks, :through => :edges_as_source
end
へー!作った関連を:throughに指定できるんですな。 ブログ名がhas_many :throughなだけあるな!(キチガイ)