2010-05-01 4 views
1

Je vais probablement avoir besoin de refactoriser en deux étapes puisque je suis encore en train de développer le projet et d'apprendre les cas d'utilisation au fur et à mesure, car c'est pour me gratter la gueule. J'ai trois modèles: Lettres, Appels, Emails. Ils ont quelque similitude, mais je prévois qu'ils auront aussi des attributs différents, comme vous pouvez le voir à partir de leur description.Comment puis-je faire fonctionner une seule aide sur différents modèles?

Idéalement je pourrais les refactoriser comme des événements, avec un type comme des lettres, des appels, des courriels, mais je ne savais pas comment étendre les sous-classes.

Mon besoin immédiat est ceci: j'ai une aide qui vérifie l'état de savoir si un e-mail (par exemple) a été envoyé à un contact spécifique:

def show_email_status(contact, email) 

    @contact_email = ContactEmail.find(:first, 
    :conditions => {:contact_id => contact.id, :email_id => email.id }) 
    if ! @contact_email.nil? 
    return @contact_email.status 
    end 
end 

je réalisais que je, bien sûr, veux de connaître l'état de savoir si un appel a été fait à un contact aussi bien, donc je l'ai écrit:

def show_call_status(contact, call) 

    @contact_call = ContactCall.find(:first, 
    :conditions => {:contact_id => contact.id, :call_id => call.id }) 
    if ! @contact_call.nil? 
    return @contact_call.status 
    end 
end 

J'aimerais être en mesure d'avoir juste un show_status unique d'aide où je peux dire show_status (contact, appel) ou show_status (contact, email) et il saura s'il faut chercher l'objet @contact_c all ou @contact_email.

Oui, ce serait plus facile s'il s'agissait seulement de @contact_event, mais je veux faire un petit refactoring pendant que le programme fonctionne, ce qui rendrait la possibilité de faire un historique pour un contact donné beaucoup plus facile .

Merci!

NOTE: Actuellement, j'ai un statut comme attribut de contact_email, contact_call, etc. Contact_email n'est créé que lorsque l'email est envoyé, donc il n'y a pas contact_email si un email n'a pas été envoyé, et je dois savoir que le statut est "unsent" ...

Répondre

0

Vous pouvez déplacer l'aide au modèle Contact.

class Contact < ActiveRecord::Base 

    has_many :contact_emails 
    has_many :contact_calls 
    has_many :contact_letters 

    def event_status event 
    assoc_name = "Contact#{event.class.name}".pluralize.underscore 
    foreign_key = "%s_id" % event.class.name.underscore 
    ce = send(assoc_name).first(:conditions => {foreign_key => event.id}) 
    ce ? ce.status : nil 
    end 

end 

Maintenant vous pouvez obtenir le statut comme suit:

contact.event_status(email1) 
contact.event_status(letter2) 
contact.event_status(call12) 

Ceci évite la nécessité d'aides différentes. Une méthode pour traiter différents événements.

+0

Salut, cela devient une erreur comme suit: pas cette colonne: emails.email_id: SELECT * FROM "emails" Où ("emails" .contact_id = 1 ET ("emails". "email_id" = 2)) L'ID pour les emails serait emails.id Je crois ... mais pas clair comment ajuster cela? – Angela

+0

J'ai enlevé le pluriel et maintenant je reçois ceci: la méthode undefined '> = 'pour {: conditions => {" email_id "=> 2}}: Hash Cela ressemble aux bons paramètres pour: conditions, mais don ne sais pas ce que la méthode non définie> = est ... – Angela

+0

Mis à jour la réponse, jetez un oeil. –

0

Puisque vous avez déjà show_call_status et show_email_status, vous pouvez écrire un troisième show_letter_status.

Utilisez ensuite ceci:

def show_status(contact, call_or_email_or_letter) 
    model_name = call_or_email_or_letter.class.name.tableize.singularize 
    send "show_#{model_name}_status", contact, call_or_email_or_letter 
end 
+0

alors je crée 3 assistants puis un méga-assistant? – Angela

+0

Ainsi, dans la vue, je me sers: <% = show_status (@ contact, email)%> -je obtenir l'erreur suivante: méthode non définie show_email_status, contact, call_or_email » pour # ce sont dans le fichier contacts_helper.rb BTW – Angela

1

En supposant l'exemple, que vos associations ressemblent à ceci:

class Contact 
    has_many :emails, :through => :contact_emails 
    has_many :calls, :through => :contact_calls 
end 

et le statut est un attribut sur ContactEmail/ContactCall, mais vous avez besoin d'un statut pour objet Email/Appel, puis (fonction de la réponse Kandada ici):

class Contact 
    def event_status(event) 
    event_type = event.class.name 
    foreign_key = ("%s_id" % event_type.downcase).to_sym 

    assoc = "Contact#{event_type}".tableize 
    contact_event = send(:assoc).first(:conditions => {foreign_key => event.id}) 
    contact_event.try(:status) 
    end 
end 
Questions connexes