3

我正在使用Ruby on Rails v3.2.2。我有以下的模型类如何“利用”已存储在数据库中的关系数据?

class Country < ActiveRecord::Base 
    has_many :regions, :foreign_key => 'country_id' 
end 

class Region < ActiveRecord::Base 
    belongs_to :country, :foreign_key => 'country_id' 
    has_many :cities, :foreign_key => 'region_id' 
end 

class City < ActiveRecord::Base 
    belongs_to :region, :foreign_key => 'region_id' 
end 

我想作一个Citybelongs_to :country

我知道,做最简单的方法是将country_id数据库表列添加到City数据库表,并说明相关的ActiveRecord关联的,这样说:

class Country < ActiveRecord::Base 
    # ... 
    has_many :cities, :foreign_key => 'country_id' 
end 

class City < ActiveRecord::Base 
    # ... 
    belongs_to :country, :foreign_key => 'country_id' 
end 

然而,为了存储少数据库数据,我想我可以“使用”已存储在Region中的数据,因为一个城市属于一个属于一个国家的地区(这意味着一个城市属于一个国家)但是,在这种情况下,我不知道如何正确指出ActiveRecord Associatio ns代表CityCountry,以“利用”所提到的关系信息隐含地呈现“通过”Region模型类。

我该如何继续?


:我是“逼迫”陈述belongs_to :country的ActiveRecord协会在City模型类,因为我想用RoR的:counter_cache功能(可belongs_to协会)才能算目前在一个国家的城市。

回答

1

使用:through选项。正如我在下面(其中的方式,是正确的)回答您的评论已经看到了,你只需要补充一点:

has_one :country, :through => :region 

到你的城市类。如果你想在国内申请counter_cache的城市,那么你就必须在该国建立类之间的关系为好,像这样:

has_many :cities, :through => :regions 

,然后你可以有你的数列

+0

通过使用你的代码,“where”/“哪个关联”我应该说''counter_cache'选项? – Backo

+0

你说你想统计一个国家的城市,那么我会为has_many城市关系 – ChuckE

+0

设置counter_cache选项,我会自己定义计数器缓存。只有belongs_to协会支持它(这是一个轨道缺陷),因此我会为该国家设置更新回调以更新其城市缓存。 http://stackoverflow.com/questions/5256897/counter-cache-with-has-many-through – ChuckE

1

根据轨道的文档,你可以指定一个has_one关系的:through选项:

:通过

指定一个加入通过模型来进行查询。由于关联使用源反射,所以:class_name,:primary_key和:foreign_key的选项将被忽略。您只能通过连接模型上的has_one或belongs_to关联使用a:through查询。

所以,你想要的是添加has_one :country, :through => :regionCity

+0

我想要在'City'中声明'belongs_to:country',因为我想按顺序使用RoR [':counter_cache'](http://guides.rubyonrails.org/association_basics.html#belongs_to-counter_cache)功能统计一个国家的城市。 – Backo

+0

我明白了。除非别人提出了一种在rails中本地执行此操作的方法,否则您可能必须自己编写此功能。 – cdesrosiers

相关问题