如何正确地将此模型添加到方法?
问题描述:
这曾经是在控制器的方法,我认为它更有意义,使之向联系模型的方法:如何正确地将此模型添加到方法?
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
每个联系人属于一个公司。每个公司可能有许多其他联系人。特定联系人的同事是指定联系人所属公司的其他成员。
我似乎得到一个错误,一堆到深层错误。
答
这是你在找什么?
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
答
试试这个:
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
改变你的标题为“如何我是否正确地将此方法添加到模型?“ :) – stephenmurdoch 2010-09-16 06:18:44
是的,谢谢我间隔......写得这么快。 – Angela 2010-09-16 15:51:10