如何从已加入相同模型/类/表的表中进行选择?

时间:2013-07-31 06:51:55

标签: ruby-on-rails postgresql activerecord

我试图计算每个联系人有多少个子接触。

Class Contacts  
has_many :subcontacts, class_name: "Contact",foreign_key: "supercontact_id" 
belongs_to :supercontact, class_name:"Contact"

这是我迄今为止的活跃记录部分,大致是我试图做的事情。

Contact.joins{subcontacts.outer}.select(subcontacts.count as subcontact_count)

我认为问题在于联接部分正在寻找关联名称,而选择部分正在寻找表名。问题是表名是同一个表...这是最好的方法,以便它保持关系或使用SQL,以便我们可以最小化查询的数量,使它不是#39 ;一个N + 1问题?

2 个答案:

答案 0 :(得分:1)

尝试使用

results = Contact.joins(:subcontacts).select("count(subcontacts.id) as count, contacts.id").group("contacts.id")

和计数可以作为

获取
results.map do |result|
  "Contact ID: #{result.id} - Subcontacts Count: #{result['count']}"
end

答案 1 :(得分:1)

Contacts.all.each do |contact|
  puts contact.name =>  contact.subcontacts.count
end

OR

Contacts.all.map{|contact| [contact.name => contact.subcontacts.count]}

以上将为您提供答案{contact_name => subcontacts.count}