RoR协会通过或不通过?

时间:2010-04-08 02:43:27

标签: ruby-on-rails associations

我有四个相互关联的模型,我现在设置的方式是我必须在进入新城市时选择一个县,地区和国家。

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

在关联中使用:through符号会更好吗?所以我可以说这个城市:

has_one :country, :through => :region

不确定这是否正确,我已经读过:通过工作,但我不确定这是否是最好的解决方案。

我是一个新手,虽然我没有在语法和工作方式上苦苦挣扎,但最好从最佳实践中获得意见以及从某些铁路巫师那里做事情的方式会很好!

提前致谢。

2 个答案:

答案 0 :(得分:1)

你需要这样做吗?你能不能只有

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

然后,如果你想找到你要做的城市的国家

my_city = City.last
my_country = my_city.county.reguion.country

答案 1 :(得分:1)

我认为这在很大程度上取决于您计划如何引用每个模型。在您拥有的设置(has_many / belongs_to)中,您可以像这样引用每个模型:

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

has_many => through关系中,您被迫通过through引用访问模型的亲属,正如他在帖子中提到的那样。

city.region.county.country # US

还要记住Rails loads model relatives lazily,这意味着如果你引用一个模型的亲戚,它就是通过它自己的SQL查询加载的。