2010-09-16 64 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