Search code examples
ruby-on-railsruby-on-rails-3single-table-inheritance

How would I setup a networked list of inherited classes in Rails


In my Rails app I'll have the following relationships:

class Location < ActiveRecord::Base; end

class Park < Location; end class Campground < Location; end class Trails < Location; end

My goal is to be able to link all of specific types of locations together. For example, if I select a park, I would like to be able to see all the campgrounds and trails that are related to the park. Likewise, if I were to select a Trail or a Campground, I would like to be able to find the other types of locations that are related to the Trail or Campground.

Any ideas how I might achieve this?

Thanks for looking


Solution

  • Depending on how you want them to be related, you will probably need a separate relationship/table to store that information. For example, you could do something like this:

    class Location < ActiveRecord::Base
      has_and_belongs_to_many :location_groups
    end
    
    class Park < Location; end class Campground < Location; end class Trails < Location; end
    
    class LocationGroup < ActiveRecord::Base
      has_and_belongs_to_many :locations
    end
    

    Then to find other "locations" in the same location group (of which it could belong to several):

    @park = Park.first
    @group = @park.location_groups.first
    @group.locations # All locations in that group
    

    Hope that helps give you some ideas!