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

我想做City belongs_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 关联CityCountry因此“利用”提到的关系信息隐含地“通过”Region模型类呈现。

我应该如何进行?


注意:我“强制”belongs_to :country在模型类中声明 ActiveRecord 关联,City因为我想使用 RoR:counter_cache功能(适用于belongs_to关联)来计算一个国家/地区的城市。

4

2 回答 2

1

根据 rails 文档,您可以在关系:through上指定一个选项has_one

:通过

指定用于执行查询的连接模型。:class_name、:primary_key 和 :foreign_key 的选项被忽略,因为关联使用源反射。您只能通过连接模型上的 has_one 或 belongs_to 关联使用 :through 查询。

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

于 2012-11-04T22:48:20.190 回答
1

使用 :through 选项。正如我在以下答案中的评论中看到的那样(顺便说一句,这是正确的),您只需添加以下内容:

has_one :country, :through => :region

到你的城市班。如果你想为城市应用 counter_cache ,那么你还必须在 country 类中建立关系,如下所示:

has_many :cities, :through => :regions

然后你可以有你的计数栏

于 2012-11-04T23:27:45.920 回答