Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何从已与相同模型/类/表联接的表中进行选择?_Ruby On Rails_Postgresql_Activerecord - Fatal编程技术网

Ruby on rails 如何从已与相同模型/类/表联接的表中进行选择?

Ruby on rails 如何从已与相同模型/类/表联接的表中进行选择?,ruby-on-rails,postgresql,activerecord,Ruby On Rails,Postgresql,Activerecord,我想知道每个联系人有多少次分包 Class Contacts has_many :subcontacts, class_name: "Contact",foreign_key: "supercontact_id" belongs_to :supercontact, class_name:"Contact" 这是到目前为止我所拥有的activerecord部分,大致上就是我要做的 Contact.joins{subcontacts.outer}.select(subcontacts.cou

我想知道每个联系人有多少次分包

Class Contacts  
has_many :subcontacts, class_name: "Contact",foreign_key: "supercontact_id" 
belongs_to :supercontact, class_name:"Contact"
这是到目前为止我所拥有的activerecord部分,大致上就是我要做的

Contact.joins{subcontacts.outer}.select(subcontacts.count as subcontact_count)
我认为问题在于联接部分正在查找关联名称,而选择部分正在查找表名称。问题是表名是同一个表。。。要做到这一点,最好的方法是什么,使其保持关系状态,还是使用SQL,这样我们就可以最小化查询数量,这样就不会出现N+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

上面将为您提供类似哈希的答案{contact_name=>subcontacts.count}

谢谢。这可能有效,但理想情况下,我希望将其作为activerecord关系保留。我简化了粘贴在这里的代码,但很大程度上取决于结果是一个关系,而不是一个数组。
Contacts.all.each do |contact|
  puts contact.name =>  contact.subcontacts.count
end

OR

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