3

Ruby onRailsv3.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アソシエーションを適切に記述して、モデルクラスを「介して」暗黙的に存在する言及された関係情報を「活用」する方法がわかりません。CityCountryRegion

どうすればいいですか?


:国に存在する都市をカウントするためにRoR機能(アソシエーションでのみ使用可能)を使用たいのでbelongs_to :country、モデルクラスでActiveRecordアソシエーションを指定することを「強制」しています。City:counter_cachebelongs_to

4

2 に答える 2

1

Railsのドキュメントによると、リレーションに:throughオプションを指定できます。has_one

:終えた

クエリを実行するための結合モデルを指定します。関連付けはソースリフレクションを使用するため、:class_name、:primary_key、および:foreign_keyのオプションは無視されます。:throughクエリは、結合モデルのhas_oneまたはbelongs_toアソシエーションを介してのみ使用できます。

したがって、必要なのはに追加するhas_one :country, :through => :regionことCityです。

于 2012-11-04T22:48:20.190 に答える
1

:throughオプションを使用します。以下の回答のコメントで見たように(ちなみに、これは正しかったです)、これを追加する必要があります。

has_one :country, :through => :region

あなたの都市のクラスに。都市のcountryにcounter_cacheを適用する場合は、次のように、countryクラスでも関係を確立する必要があります。

has_many :cities, :through => :regions

そして、あなたはあなたのカウント列を持つことができます

于 2012-11-04T23:27:45.920 に答える