has_and_belongs_to_one_self

Journal entry
October 4, 2005

This little Ruby on Rails snippet solves a problem I’ve seen some people get confused by. I figured I’d share my way of doing it.

The trick to behind creating a has_and_belongs_to_many association that associates rows in the same table is to specify more options than you’re used to. Rails can’t figure out how to work it’s magic when associationg 2 classes named the same, so you have to guide it by hand. From a current project in the works:

class ClassDescription < Description
  has_and_belongs_to_many :included_modules, :class_name => 'ModuleDescription', :join_table => 'includes_modules', :foreign_key => 'description_id', :association_foreign_key => 'module_id'
end

Note that this also adds Single Table Inheritance (STI) into the mix, which makes the above less clear. The simplest thing you have to do is:

has_and_belongs_to_many :models, :association_foreign_key => 'other_model_id'

You may want to specify more options to make your tables more readable. The above assumes a table called model_model with the fields model_id and other_model_id.

Categories
Selling out
Did you know?
Jakob is an independent web application developer who builds awesome stuff for the web. You can hire him to build awesome stuff for you.

Comments and Trackbacks

Commenting on this entry has been closed.