1

Disons que j'ai un modèle STI appelé Company. Il a trois sous-classes Firm, Client et PriorityClient.Comment créer une association HABTM avec des sous-classes de modèles STI?

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 

J'ai un autre modèle appelé Country. Maintenant, je veux créer une association has_and_belongs_to_many entre Country et firms_n_clients (seulement Firm et Client type de Company). Comment serait-il?

Merci d'avance.

+0

voir le tag: [Tag: class-table-inheritance] –

Répondre

1

has_and_belongs_to_many associations acceptent les étendues. Certains d'entre eux sont discutés dans le Ruby on Rails documentation. En supposant que la table de jointure nécessaire existe, l'association peut être établie comme ceci:

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 

S'il vous plaît noter le code en double dans le client et ferme. C'est intentionnel, car il révèle explicitement que les clients et les entreprises ont des pays et appartiennent à des pays, contrairement aux PriorityClients.

Je n'ai pas testé le code ci-dessous, mais une meilleure façon de modifier l'Association HABTM serait de fusionner les les firms_n_clients portée:

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

Cela présente plusieurs avantages: Le modèle Country n » t besoin de connaître les différents types d'entreprises, et la modification de la portée affectera également l'association.

+0

Nous vous remercions de votre réponse. Maintenant, ma question est de savoir comment serait la table intermédiaire? Serait-ce 'companies_countries' avec' company_id' et 'country_id' ou il y aura deux tables intermédiaires comme' fir_countries' et 'clients_countries'? –

+0

@JunanChakma Pensez à Join Tables comme une connexion entre des tables, pas entre des modèles. C'est pourquoi une table avec country_id et company_id est la voie à suivre. 'les rails génèrent la migration CreateJoinTableCompanyCountry country'' devrait générer la migration requise. – SvenDittmer

+0

cela fonctionne. J'ai accepté la réponse. Je vous remercie. –