如何将此模型正确添加到方法中?

时间:2010-09-16 04:53:31

标签: ruby-on-rails model

这是一种以前在控制器中的方法,我认为将它作为Contact模型的方法更有意义:

  def colleagues 

    company = Company.find(self.company_id) 

    contacts = company.contacts.collect(&:full_name)

    contacts.each do |contact|
       colleagues = contacts.reject{ |c| c==contact }
    end 

    return colleagues

  end

每个联系人都属于公司。每个公司可能有许多其他联系人。特定联系人的同事是指定联系人所属的公司的其他成员。

我似乎得到了一个错误,一个堆栈到深度错误。

2 个答案:

答案 0 :(得分:2)

这是你在找什么?

class Contact
  belongs_to :company

  def colleagues
    self.company.contacts
  end
end

如果您不希望自己包含在联系人列表中,可以使用reject

class Contact
  belongs_to :company

  def colleagues
    self.company.contacts.reject { |contact| contact == self }
  end
end

您上次评论的更新:

def colleagues
  self.company.contacts.collect { |contact| contact.full_name }.to_sentence
end

或者,如果您不想包括自己:

def colleagues
  colleagues = self.company.contacts.reject { |contact| contact == self }
  colleagues.collect { |contact| contact.full_name }.to_sentence
end

答案 1 :(得分:0)

试试这个:

class Contact
  belongs_to :company
  has_many :colleagues, :through => :company, :source  => :contacts, 
                        :conditions => 'contacts.id != #{id}'
end


class Company
  has_many :contacts
end

现在,您可以进行以下调用:

contact.colleagues                              # colleagues list
contact.colleagues.map(&:full_name).to_sentence # colleague names string

您可以按如下方式进一步优化结果:

contact.colleagues.all(:select => :full_name).map(&:full_name).to_sentence