1

Companyと呼ばれるSTIモデルがあるとします。それは3つのサブクラスFirm,ClientおよびPriorityClientを有する。STIモデルのサブクラスとHABTMの関連付けを作成するにはどうすればよいですか?

class Company < ActiveRecord::Base 
    scope :firms_n_clients, -> { where(type: %w(Firm Client)) } 
end 
class Firm < Company; end 
class Client < Company; end 
class PriorityClient < Company; end 

Countryという別のモデルがあります。今度は、Countryfirms_n_clientsFirmClientタイプはCompany)の間のhas_and_belongs_to_manyの関連付けを作成したいと思います。それはどうですか?

ありがとうございます。

+0

タグを見る:[タグ:クラステーブル継承] –

答えて

1

has_and_belongs_to_many associationsはスコープを受け入れます。それらのいくつかはRuby on Rails documentationで議論されています。必要なジョインテーブルが存在すると仮定すると、次のようにアソシエーションを確立できます。

class Country < ActiveRecord::Base 
    has_and_belongs_to_many :companies, -> { where(type: %w(Firm Client)) } 
end 

class Firm < Company 
    has_and_belongs_to_many :countries 
end 

class Client < Company 
    has_and_belongs_to_many :countries 
end 

クライアントと企業の重複したコードに注意してください。これは、クライアントと企業が国を所有していることを明示的に明らかにし、PriorityClientsが明示していないためです。

は、私は以下のコードをテストしていませんが、HABTM協会を変更するためのより良い方法はfirms_n_clients範囲をマージすることになります。

class Country < ActiveRecord::Base 
    has_and_belongs_to_many :companies, -> { merge(Company.firms_n_clients) } 
end 

これにはいくつかの利点があります。国のモデルは」doesnのさまざまな会社の種類について知る必要があり、範囲を変更することは協会にも影響します。

+0

ありがとうございました。今私の質問は、どのように中間のテーブルになりますか?それは 'company_countries'と' country_id'を持つ 'companies_countries'ですか、' firm_countries'と 'clients_countries'のような2つの中間テーブルでしょうか? –

+0

@ JunanChakmaモデル間ではなく、テーブル間の接続として結合テーブルを考える。だからこそ、country_idとcompany_idを持つテーブルが行く方法です。 'Railは移行を生成するCreateJoinTableCompanyCountry company country'は必要な移行を生成するはずです。 – SvenDittmer

+0

は動作しています。私は答えを受け入れた。ありがとうございました。 –

関連する問題