2010-04-22 11 views
0

Avertissement: Je n'ai peut-être pas la bonne 'déclaration de problème', mais voilà:Comment faire une association has_many through sur une association has_many through rails?

Une campagne a de nombreux contacts.

Une campagne contient de nombreux e-mails. Par conséquent, un contact a de nombreux e-mails via une campagne.

Et un email peut avoir plusieurs contacts via une campagne.

Chaque paire Contact-Email a son propre statut (status1, status2, etc). Chaque statut (pour une paire Contact-Email) aura son propre utilisateur.

Je ne sais pas modéliser Status ou User. Actuellement, le défi immédiat est le statut.

(voir schéma ci-dessous)

alt text http://img88.imageshack.us/img88/7086/statusassociations.png

Répondre

0

Solution ci-dessous suppose que l'état peut être représenté comme une chaîne.

class Campaign < ActiveRecord::Base 
    has_many :contacts 
end 

class Contact < ActiveRecord::Base 
    belongs_to :campaign 
    has_many :contact_emails 
    has_many :emails, :through => :contact_emails 
end 

class ContactEmail < ActiveRecord::Base 
    belongs_to :contact 
    belongs_to :email 
    belongs_to :user 
    # add a column called status 
end 

class Email < ActiveRecord::Base 
    has_many :contact_emails 
    belongs_to :contacts, :through => :contact_emails 
end 

Ajout d'e-mails à contacter:

contact_email = @contact.contact_emails.build(:user => current_user, 
     :email => @email, :status => "status1") 

contact_email.save 

OU

@contact.contact_emails.create(:user => current_user, 
    :email => @email, :status => "status1") 

OU créer plusieurs:

@contact.contact_emails.create(
    [ 
    { 
     :user => current_user, 
     :email => @email, 
     :status => "status1" 
    }, 
    { 
     :user => current_user, 
     :email => @email2, 
     :status => "status2" 
    } 
    ] 
) 

Edit 2 Ressources imbriquées pour ContactEmail.

map.resources :contacts, has_many :contact_emails 

URL pour ContactEmail

/contacts/1/contact_emails/new #new 
/contacts/1/contact_emails/2/edit #edit 

L'URL ne pas l'id e-mail. Vous pouvez passer le email_id comme paramètre de requête, à savoir

new_contact_contact_email_path(@contact, :email_id => @email) 

Dans votre ContactEmailsController:

def new 
    @contact = Contact.find(params[:contact_id]) 
    @email = Email.find(params[:email_id]) 
    @contact_email = @contact.contact_emails.build(:email => @email) 
end 

Selon vous définissez email_id champ comme caché.

Dans la méthode create, effectuez l'enregistrement.

def create 
    @contact = Contact.find(params[:contact_id]) 
    @contact_email = @contact.contact_emails.build(params[:contact_email]) 
    if @contact_email.save 
    # success 
    else 
    # error 
    end 
end 
+0

alors ContactEmail est un nouveau modèle qui représente une paire contact-email? – Angela

+0

Oui, ContactEmail est la paire. –

+0

Est-ce que ContactEmail aurait aussi besoin d'avoir ses propres attributs, exactement comme le fait le courrier électronique (mais avec du texte mailmergé?) Ou est-ce juste un espace réservé et l'email est envoyé et le contenu jamais stocké? – Angela

Questions connexes