2010-07-11 2 views
0

Je commence à avoir une certaine difficulté à faire ce plus DRY:Comment simplifier mon assistant et le rendre plus sec quand il y a des modèles similaires?

http://gist.github.com/471225

L'essentiel de c'est ceci:

J'ai un tas de modèles, contact_email, contact_call, contact_letter, etcetera.

Ils étaient essentiels pour que j'instancie des instances du modèle de courrier électronique (pensez-y comme un modèle) avec une instance/un enregistrement spécifique de Contact. Parce que les modèles qu'ils référencent étaient différents, j'avais besoin d'un moyen pour que le contrôleur référence le bon modèle.

Mais cela devient compliqué. J'ai joué avec différentes manières d'utiliser 'envoyer' et des parties de Ruby pour identifier la classe associée, donc je n'ai pas besoin de l'énoncer explicitement, mais je n'ai pas de chance.

Ainsi - très peu ... aide!

+0

curieux quel est le but de l'instance @variables? Les référez-vous en dehors de la méthode? –

+0

ces @variables sont utilisées dans la vue .... – Angela

Répondre

0

bien, voici mon premier grand coup à elle:

def show_contact_status(contact, method, contact_class) 
    if @contact_method = contact_class.for_contact(contact, method).first 
    @contact_method.formatted_status_message 
    else 
    "no status" 
    end 
end 

Et puis dans vos modèles, vous devez ajouter un champ nommé:

named_scope :for_contact, lambda {|contact, method| 
    {:conditions => {:contact_id => contact.id, :email_id => method.id}} 
} 

puis une méthode formatted_status_message dans votre modèle ContactEmail :

def formatted_status_message 
    "#{self.status.to_s} (#{self.date_sent.to_s(:long)}" 
end 

Et dans vos autres modèles:

def formatted_status_message 
    "sent #{self.date_sent_to_s(:long)}" 
end 

et vous appelez la méthode pour le courrier électronique:

show_contact_status(contact, method, ContactEmail) 

J'ai essayé de déplacer autant que possible à la couche de modèle et l'effet de levier qui, au lieu de métaprogrammation dans ce cas.

+0

Je vois, laissez-moi essayer ceci .... – Angela

+0

Salut, je suppose que je suis confus autour de la named_scope: for_contact - la seule condition qu'il a est pour: email_id. ..mais chaque contact pourrait avoir Email, Voicemail, Postcard, Letter ..... pensez-vous que vous pourriez clarifier cela un peu pour moi, merci! – Angela

Questions connexes