如何“利用”已存储在数据库中的关系数据?

时间:2012-11-04 22:14:13

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord associations

我正在使用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中的数据,因为一个城市属于一个区域反过来属于一个国家(这意味着一个城市属于一个国家)但是,在这种情况下,我不知道如何正确陈述CityCountry的ActiveRecord关联所以“利用”提到的关系信息隐含地“通过”Region模型类。

我该怎么办?


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

2 个答案:

答案 0 :(得分:1)

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

  

<强>:通过

     

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

因此,您想要的是将has_one :country, :through => :region添加到City

答案 1 :(得分:1)

使用:through选项。正如我在下面的答案中看到的那样(顺便说一句,这是正确的),你只需添加这个:

has_one :country, :through => :region

到您的城市课程。如果您想在国家/地区为城市应用counter_cache,那么您还必须在国家/地区类中建立关系,如下所示:

has_many :cities, :through => :regions

然后你可以拥有你的计数栏