Ruby on rails 从另一个表中提取数据时计数不同的记录

Ruby on rails 从另一个表中提取数据时计数不同的记录,ruby-on-rails,ruby,ruby-on-rails-4,activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Activerecord,给定Rails应用程序,其中: class Team < ActiveRecord::Base belongs_to :captain, class_name: User 我可以得到每个队长的身份证和队数: > Team.group(:captain_id).count => {85=>3, 106=>1, 81=>1, 25=>1, 32=>1, 8=>3, 1=>1, 79=>2, 26=>1} 但是它会变得丑陋

给定Rails应用程序,其中:

class Team < ActiveRecord::Base
  belongs_to :captain, class_name: User
我可以得到每个队长的身份证和队数:

> Team.group(:captain_id).count
=> {85=>3, 106=>1, 81=>1, 25=>1, 32=>1, 8=>3, 1=>1, 79=>2, 26=>1}
但是它会变得丑陋。以下操作可以正常工作,但看起来很难看,并且有n+1个SQL查询:

Team.group(:captain_id).count.sort.to_h.each { |key,val| puts "#{User.where(id: key).pluck(:id, :first, :last)}  Teams: #{val}" }

Rails的方式是什么?

由于您试图获取有关用户的详细信息,您可能希望在您的用户模型上定义如下关系:

class User < ActiveRecord::Base
  has_many :captained_teams, foreign_key: :captain_id, class_name: Team
sql=**选择计数,然后按计数分组**

结果=ActiveRecord::Base.connection.executesql


您可以使用原始sql来获取所需内容。

您的问题不是直接重复的,但您可能会在中发现一些有用的内容。另外,使您的关联双向。我认为您永远不需要同时使用.join和.includes。我认为公正。包括将做的工作。加入是必要的,只考虑用户是队队长。这是栏杆的方式!通过ActiveRecord控制表上的查询,使查询尽可能简单。
class User < ActiveRecord::Base
  has_many :captained_teams, foreign_key: :captain_id, class_name: Team
User.joins(:captained_teams).includes(:captained_teams).each do |user|
  puts "#{[user.id, user.first, user.last]}  Teams: #{user.captained_teams.length}"
end