Ruby on rails 如何让一个助手在不同的模型上工作?

Ruby on rails 如何让一个助手在不同的模型上工作?,ruby-on-rails,helpers,Ruby On Rails,Helpers,我可能需要分两步进行重构,因为我仍在开发项目,并在进行过程中学习用例,因为这是为了搔痒。我有三种模式:信件、电话、电子邮件。它们有一些相似之处,但我预计它们也会有一些不同的属性,从它们的描述中可以看出 理想情况下,我可以将它们重构为事件,类型为信件、电话、电子邮件,但不知道如何扩展子类 我迫切需要的是:我有一个助手,负责检查电子邮件是否发送给特定联系人的状态: def show_email_status(contact, email) @contact_email = ContactEma

我可能需要分两步进行重构,因为我仍在开发项目,并在进行过程中学习用例,因为这是为了搔痒。我有三种模式:信件、电话、电子邮件。它们有一些相似之处,但我预计它们也会有一些不同的属性,从它们的描述中可以看出

理想情况下,我可以将它们重构为事件,类型为信件、电话、电子邮件,但不知道如何扩展子类

我迫切需要的是:我有一个助手,负责检查电子邮件是否发送给特定联系人的状态:

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_statuscontact、call或show_statuscontact、email,它会知道是查找对象@contact_call还是@contact_email

是的,如果只是@contact_事件,那会更容易,但我想在程序启动和运行时进行一次小的重构,这将使为给定联系人创建历史记录的能力变得更容易

谢谢


注意:目前我的状态是contact\u email、contact\u call等属性。contact\u email仅在电子邮件发送时创建,因此如果电子邮件尚未发送,则不会有contact\u email,我需要知道状态是unsent…

,因为您已经有show\u call\u status和show\u email\u 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

由于您已经具有“显示通话”状态和“显示电子邮件”状态,因此可以编写第三封“显示信函”状态

然后用这个:

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

可以将辅助对象移动到联系人模型


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

可以将辅助对象移动到联系人模型


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

根据示例,假设您的关联如下所示:

class Contact
    has_many :emails, :through => :contact_emails
    has_many :calls, :through => :contact_calls
end
状态是ContactEmail/ContactCall上的一个属性,但您需要Email/Call对象的状态,然后根据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

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

class Contact
    has_many :emails, :through => :contact_emails
    has_many :calls, :through => :contact_calls
end
状态是ContactEmail/ContactCall上的一个属性,但您需要Email/Call对象的状态,然后根据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

因此,我创建了3个助手,然后创建了一个mega helper?因此在视图中,我使用了:我得到了以下错误:未定义的方法“show_email_status,contact,call_或_email”,因为它们在contacts_helper.rb文件btwso中,我创建了3个助手,然后创建了一个mega helper?因此在视图中,我正在使用:我得到以下错误:未定义的方法“显示电子邮件状态、联系人、呼叫或电子邮件”,因为它们位于contacts\u helper.rb文件btwHi中,这会得到如下错误:没有这样的列:emails.email\u id:SELECT*从emails.contact\u id=1和emails.email\u id=2的电子邮件中,电子邮件的id应该是emails.id,我相信…但不清楚如何调整它?我删除了复数形式,所以现在我得到了这个:{:条件=>{email\u id=>2}的未定义方法“>=”:Hash看起来像:conditions的正确参数,但不知道未定义的方法>=是什么…更新了答案,看一看。您好,这可能与主题无关,但您认为我应该将这些参数移到单个表继承中吗?那会有帮助吗?问题是,动作是如此的不同……STI针对哪个模式?Contact/Email/Letter?您好,这里有一个错误如下:没有这样的列:emails.Email\u id:SELECT*从emails.Contact\u id=1和emails.Email\u id=2的电子邮件中,电子邮件的id应该是emails.id,我相信…但不清楚如何调整它?我删除了复数形式,所以现在我得到了:{:条件=>{Email\u id=>2}的未定义方法“>=”:Hash看起来像:conditions的正确参数,但不知道未定义的方法>=是什么…更新了答案,看一看。您好,这可能与主题无关,但您认为我应该将这些参数移到单个表继承中吗?那会有帮助吗?问题是,动作是如此的不同……STI针对哪个模式?联系方式/电子邮件/信函?