2010-01-21 6 views
0

Je veux construire quelque chose pour qu'une personne puisse avoir beaucoup d'adresses e-mail et une adresse e-mail ne compte qu'une seule personne, mais parce que j'ai aussi un autre modèle appelé Entreprise qui peut aussi avoir beaucoup d'adresses email, et je ne veux pas avoir des colonnes company_id et person_id dans le tableau des e-mails, donc je pensais que je peux faire ...has_one: à travers un modèle de jointure

person.rb

has_many: person_emails has_many: e-mails,: à travers =>: person_emails

person_emails.rb

belongs_to: personne belongs_to: email

email.rb

has_one: person_email has_one: personne,: par =>: person_email

Ce qui se passe maintenant est que ...

p = person.first # => "Nik" p.emails # => affiche tous les e-mails que Nik a p.person_emails # => affiche tous les enregistrements de tables conjointes person_email pour Nik

e = Email.first # => l'une des adresses e-mail de Nik e.person_email # => affiche le seul et unique enregistrement de la table conjointe de ce courriel e.person # échoue en indiquant la colonne inconnue "people.email_id" dans clause where

Je voudrais ... e.person # => "Nik"

est-ce que quelqu'un a une idée de ce que le problème pourrait être?

Merci Vous

Répondre

4

Votre situation suggère d'utiliser des associations polymorphiques, qui sont beaucoup plus propres que has_many :through associations. Par exemple:

class Person 
    has_many :emails, :as => :emailable 
end 

class Company 
    has_many :emails, :as => :emailable 
end 

class Email 
    belongs_to :emailable, :polymorphic => true 
end 

Vous pouvez vous débarrasser de votre classe entièrement PersonEmails. Dans la base de données, votre table emails ressemblera à quelque chose comme ceci:

create_table :emails do |t| 
    t.string :address 
    t.string :emailable_type 
    t.integer :emailable_id 
end 

Les magasins de colonne emailable_type le nom du modèle associé, dans votre cas "Person" ou "Company", et emailable_id stocke l'id de l'objet associé. Pour plus d'informations, voir the Rails API documentation sous "Associations polymorphes".

Questions connexes