many:many relation on a single table

Consider a tree. Not a perfect example since every branch only has
one parent...but you get the idea.

What I want is the following:


I think the problem is not being able to change the method name
without changing the attribute it points to. Here is my idea so far.

Thanx for looking!

class Branch < ActiveRecord::Base
  has_many :parents, :through => :relations
  has_many :children, :through => :relations

class Relation < ActiveRecord::Base
      belongs_to :branch, :foreign_key => "parent_id"
      belongs_to :branch, :foreign_key => "child_id"

table Relations
parent_id int
child_id int
foo ---
bar ---

You're going to have to be very, very careful to not create loops (eg
situations where something is a child of itself) if you're going after a
tree structure. That's the sort of data integrity thing that I would shove
right down to the database layer as triggers on your appropriate table.

The schema here (from my old perl days) does that:

In postgres:


Hopefully you'll find something there you can use.


Hmm, check out plugins like acts_as_graph: