1

我可能需要分两步进行重构,因为我仍在开发项目并学习用例,因为这是为了解决我自己的问题。我有三个模型:信件、电话、电子邮件。它们有一些相似之处,但我预计它们也会有一些不同的属性,正如你可以从它们的描述中看出的那样。

理想情况下,我可以将它们重构为事件,类型为 Letters、Calls、Emails,但不知道如何扩展子类。

我的迫切需要是:我有一个助手可以检查电子邮件(例如)是否发送给特定联系人的状态:

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

我意识到我当然也想知道是否给联系人打了电话的状态,所以我写道:

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

我希望能够只有一个助手 show_status,我可以在其中说 show_status(contact,call) 或 show_status(contact,email),它会知道是查找对象 @contact_call 还是 @contact_email。

是的,如果它只是@contact_event 会更容易,但我想在程序启动并运行时做一个小的重构,这将使为给定联系人创建历史记录的能力变得更加容易。

谢谢!

注意:目前我有状态作为contact_email,contact_call等的属性。Contact_email仅在发送电子邮件时创建,因此如果尚未发送电子邮件,则没有contact_email,我需要知道状态是“未发送”...

4

3 回答 3

1

假设从示例中,您的关联如下所示:

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

状态是 ContactEmail / ContactCall 的一个属性,但您需要电子邮件 / 呼叫对象的状态,然后(基于此处的 Kandada 回答):

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
于 2010-05-02T13:25:43.700 回答
0

由于您已经有了 show_call_status 和 show_email_status,您可以编写第三个 show_letter_status。

然后使用这个:

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
于 2010-05-01T19:08:42.050 回答
0

您可以将助手移动到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

现在您可以获得如下状态:

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

这减轻了对不同助手的需求。一种处理不同事件的方法。

于 2010-05-02T01:51:39.313 回答