L'objectif final est de créer un assistant trouvé à la fin appelé show_status (contact, événement).Comment puis-je faire ce code (assistant) DRY dans Rails où j'appelle modèles similaires?
L'événement peut être n'importe quel objet, Email, Letter, etc. La combinaison d'un modèle d'e-mail envoyé à un contact est un enregistrement spécifique ContactEmail. Parce que chaque événement a un modèle correspondant différent, je dois faire le .find sur, j'ai la duplication. Il doit y avoir un meilleur moyen!
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.to_s + " (" + @contact_email.date_sent.to_s + ")"
else
return "no status"
end
end
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 "sent " + @contact_call.date_sent.to_s(:long)
else
return "no status"
end
end
def show_letter_status(contact, letter)
@contact_letter = ContactLetter.find(:first, :conditions => {:contact_id => contact.id,
:letter_id => letter.id })
if ! @contact_letter.nil?
return "sent " + @contact_letter.date_sent.to_s(:long)
else
return "no status"
end
end
def show_voicemail_status(contact, voicemail)
@contact_event = ContactEvent.find(:first, :conditions => {:contact_id => contact.id,
:event_id => voicemail.id,
:type => "voicemail"})
if ! @contact_event.nil?
return "sent " + @contact_event.date_sent.to_s(:long)
else
return "no status"
end
end
def show_postalcard_status(contact, postalcard)
@contact_postalcard = ContactPostalcard.find(:first, :conditions => {:contact_id => contact.id,
:postalcard_id => postalcard.id })
if ! @contact_postalcard.nil?
return "sent " + @contact_postalcard.date_sent.to_s(:long)
else
return "no status"
end
end
def show_status(contact, call_or_email_or_letter_or_voicemail)
model_name = call_or_email_or_letter_or_voicemail.class.name.tableize.singularize
send "show_#{model_name}_status", contact, call_or_email_or_letter_or_voicemail
end
Ah, c'est intéressant ... J'essayais de penser à la façon de faire cela, mais vous passez l'actif spécifique dans ... cela pourrait le faire ... laissez-moi jouer avec elle .... – Angela
Cette deuxième méthode. ... où cherche-t-il le contact_id correspondant? On dirait qu'il passe par la table de contact_emails (par exemple) et qu'il cherche juste sur l'email.id ... correspondant ... mais qu'en est-il de contact_id? – Angela
Il est implicite car nous utilisons une recherche dans les associations. Si vous vérifiez le fichier journal, vous verrez que SQL exécuté a le contact_id. –