2010-09-16 63 views
0

这曾经是在控制器的方法,我认为它更有意义,使之向联系模型的方法:如何正确地将此模型添加到方法?

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 

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

我似乎得到一个错误,一堆到深层错误。

+0

改变你的标题为“如何我是否正确地将此方法添加到模型?“ :) – stephenmurdoch 2010-09-16 06:18:44

+0

是的,谢谢我间隔......写得这么快。 – Angela 2010-09-16 15:51:10

回答

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 
+0

我如何让同事像to_sentence一样行事。用法是替换同事,使其输出如“联系人1,联系人2和联系人3” – Angela 2010-09-16 05:32:04

+0

哦,并且我显示每个联系人都是同事的.full_name .... – Angela 2010-09-16 05:32:41

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 
+0

这很好!不幸的是,作为输出,她希望一个字符串不是一个联系人的集合...有没有办法使用has_many:通过并返回一个字符串? – Mischa 2010-09-16 05:52:59

+0

我已经更新了答案。看一看。 – 2010-09-16 06:12:38