views:

42

answers:

2

I have four models that are related to one another, the way I have it setup at the moment is I have to select a county, region and country when entering a new city.

class Country < ActiveRecord::Base    
  has_many :regions    
  has_many :counties    
  has_many :cities    
end

class Region < ActiveRecord::Base
  has_one :country
  has_many :counties
  has_many :cities
end

class County < ActiveRecord::Base
  has_one :country
  has_one :region
  has_many :cities
end

class City < ActiveRecord::Base
  has_one :country
  has_one :region
  has_one :county
end

Would it be better to use the :through symbol in the association? So I could say the city:

has_one :country, :through => :region

Not sure if this is correct, I have read how :through works but I'm not sure if this is the best solution.

I am a newbie and while I'm not struggling with the syntax and how things work, it would be good to get opinions on best practices and the way things should be done from some rails wizards!

Thanks in advance.

+1  A: 

Do you need to do that? Could you not just have

class Country < ActiveRecord::Base    
  has_many :regions   
end

class Region < ActiveRecord::Base
  belongs_to :country
  has_many :counties
end

class County < ActiveRecord::Base
  belongs_to :region
  has_many :cities
end

class City < ActiveRecord::Base
  belongs_to :county
end

Then if you want to find the country of a city you would do

my_city = City.last
my_country = my_city.county.reguion.country
Will
Thanks Will, I was over complicating.
showFocus
+1  A: 

I think this largely depends on how you plan on referencing each model. In the setup you have (has_many/belongs_to), you'd reference each model like so:

city = City.find("Los Angeles, CA")
city.country # US
city.county # Los Angeles County
city.region # CA

Whereas in a has_many => through relationship, you're forced to access a model's relatives through the through reference, as Will mentioned in his post.

city.region.county.country # US

Also keep in mind that Rails loads model relatives lazily, meaning if you reference a model's relative it is loaded through it's own SQL query.

Damien Wilson