2010-10-25 10 views
1

J'ai un modèle de contact, ceci inclut le nom, l'adresse, le numéro de téléphone, etc.Comment modéliser ces relations?

J'ai un modèle d'utilisateur qui devrait avoir un contact.

J'ai un modèle client qui a_many contacts.

J'ai un modèle Producer qui a beaucoup de contacts.

Un contact peut être uniquement un utilisateur, un utilisateur et un client, un utilisateur et un producteur, ou une combinaison de ces trois éléments. Je dois également être sûr que le même enregistrement de contact est lié lorsqu'un contact est lié à plusieurs modèles pour l'intégrité des données.

comment dois-je créer les associations?

Répondre

1

Cela ressemble à une bonne application pour un polymorphic association:

class User < ActiveRecord::Base 
    has_one :contact, :as => :contactable 
end 

class Customer < ActiveRecord::Base 
    has_many :contacts, :as => :contactable 
end 

class Producer < ActiveRecord::Base 
    has_many :contacts, :as => :contactable 
end 

class Contact < ActiveRecord::Base 
    belongs_to :contactable, :polymorphic => true 
end 

EDIT

Il semble que je ne l'ai pas lu les spécifications tout au long :) Pour associer le même contact avec plusieurs Les utilisateurs, les clients, etc., vous pouvez utiliser un has_many :through:

class User < ActiveRecord::Base 
    has_one :user_contact, :dependent => :destroy 
    has_one :contact, :through => :user_contact 
end 

class Customer < ActiveRecord::Base 
    has_many :customer_contacts, :dependent => :destroy 
    has_many :contacts, :through => :customer_contacts 
end 

class Producer < ActiveRecord::Base 
    has_many :producer_contacts, :dependent => :destroy 
    has_many :contacts, :through => :producer_contacts 
end 

class UserContact 
    belongs_to :user 
    belongs_to :contact 
end 

class CustomerContact 
    belongs_to :customer 
    belongs_to :contact 
end 

class ProducerContact 
    belongs_to :producer 
    belongs_to :contact 
end 

class Contact < ActiveRecord::Base 
    has_many :user_contacts, :dependent => :destroy # might use 'has_one' here depending on your requirements 
    has_many :users, :through => :user_contacts 
    has_many :customer_contacts, :dependent => :destroy 
    has_many :customers, :through => :customer_contacts 
    has_many :producer_contacts, :dependent => :destroy 
    has_many :producers, :through => :producer_contacts 
end 

Cela vous donne un joindre une table pour chacune des trois associations. Chaque contact peut appartenir à aucun, un ou plusieurs des trois autres modèles en ajoutant des lignes aux tables de jointure.

+0

mais comment un contact appartient-il à un utilisateur, à un client et à un producteur en même temps? Avec cela, le contact ne serait-il pas associé à un seul type? – thargor

+0

Euh, oui, c'est vrai. Voir ma modification. – zetetic

Questions connexes