当有类似的模型时,如何简化我的助手并使其更干燥?

时间:2010-07-11 02:49:19

标签: ruby-on-rails dry

我开始遇到一些困难让这更干嘛:

http://gist.github.com/471225

它的主旨是:

我有一堆模型,contact_email,contact_call,contact_letter等。

这些必不可少的方法让我能够实例化与联系人的特定实例/记录相匹配的电子邮件模型实例(将其视为模板)。

因为他们引用的模型不同,我需要一种方法让控制器引用正确的模型。

但这变得复杂了。我玩不同的方式使用'发送'和部分Ruby来识别相关的类,所以我不需要明确说明它,但没有运气。

因此 - 非常不干净......帮助!

1 个答案:

答案 0 :(得分:0)

好吧,这是我的第一次打击:

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}}
}

然后在ContactEmail模型中使用formatted_status_message方法:

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)

我试图尽可能多地移动到模型层并利用它,而不是在这种情况下进行元编程。