ну вот мой первый удар по нему:
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
И тогда в ваших моделях вы бы добавили именованную область:
named_scope :for_contact, lambda {|contact, method|
{:conditions => {:contact_id => contact.id, :email_id => method.id}}
}
, а затем formatted_status_message
метод в вашей модели ContactEmail:
def formatted_status_message
"#{self.status.to_s} (#{self.date_sent.to_s(:long)}"
end
А в других ваших моделях:
def formatted_status_message
"sent #{self.date_sent_to_s(:long)}"
end
и вы вызываете метод для электронной почты:
show_contact_status(contact, method, ContactEmail)
Я пытался максимально приблизиться к слою модели и использовать его вместо метапрограммирования в этом случае.