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:

Branch.children
Branch.parents

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
end

class Relation < ActiveRecord::Base
belongs_to :branch, :foreign_key => “parent_id”
belongs_to :branch, :foreign_key => “child_id”
end

---------DB-------
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:

http://search.cpan.org/src/CRAKRJACK/Schema-RDBMS-AUS-0.03/schema/

In postgres:

http://search.cpan.org/src/CRAKRJACK/Schema-RDBMS-AUS-0.03/schema/Pg/0.01/216_user_membership_insert.sql

In MySQL:

http://search.cpan.org/src/CRAKRJACK/Schema-RDBMS-AUS-0.03/schema/mysql/0.01/216_user_membership_insert.sql

Hopefully you’ll find something there you can use.

Cheers,
Tyler

Josh [email protected] wrote:

without changing the attribute it points to. Here is my idea so far.
belongs_to :branch, :foreign_key => “child_id”

Hmm, check out plugins like acts_as_graph:
http://blog.tammersaleh.com/pages/acts_as_graph

Jason