Models that reference themselves

Hi

I'm pretty much a newbie to Rails and I have at least two projects under development that are going to need the same type of constructs and I'm struggling to get my head around how to achieve what I want using Rails models and relationships.

In one project I have a hierarchy of (geographical) sites. For example:

Earth   Europe     Ireland       Cork       Kerry       Galway       ......     UK     France   America

If I were using any other language my sites model would look like:

id, # Primary Key site_name, parent_id # references the id of this site's parent.

In Rails I think I need to:

1. Drop the parent_id column 2. Use a bridge table to bridge the site id back to the parent site record and 3. A has_and_belongs_to_many relationship

Is this the correct approach?

I'm sure this must have been done before as I have two projects that I want to do the same thing in. I've found examples in the wiki of bridging two tables in this way; but I've not found a way of linking a table back to itself.

Any assistance will be gratefully appreciated.

Regards

David

If a site has only one parent then you should stick with parent_id.

You then stick belongs_to :parent, :class_name => 'Site', :foreign_key => 'parent_id'

in your Site model

Fred

Many thanks Frederick. Yes a site can only have one parent. I will give your suggestion a try and see how I get on.

Cheers

David

> > If I were using any other language my sites model would look like: > > id, # Primary Key > site_name, > parent_id # references the id of this site's parent. > > In Rails I think I need to: > > 1. Drop the parent_id column > 2. Use a bridge table to bridge the site id back to the parent site > record and > 3. A has_and_belongs_to_many relationship > > Is this the correct approach? > If a site has only one parent then you should stick with parent_id.

You then stick belongs_to :parent, :class_name => 'Site', :foreign_key => 'parent_id'

in your Site model

May also want to add: has_many :children, :class_name =>"Site", :foreign_key => "parent_id"

You could also look at acts_as_tree, acts_as_nested_set and various other plugins for managing hierarchic data structures.

Isak