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

相關問題