2017-11-11 189 views
0

鉴于Rails应用程序,其中:计数不重复的记录,同时从另一个表拔毛

class Team < ActiveRecord::Base 
    belongs_to :captain, class_name: User 

我想简洁查询数据库并获得船长的总结和团队的人数它们属于:

[[23, "Pat", "Smith"]] Teams: 1 
[[46, "Kate", "Jones"]] Teams: 1 
[[107, "John", "Doe"]] Teams: 3 
... 

我可以得到每个船长的ID的哈希和球队的数量:

> 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的方法是什么?

+0

您的问题不是直接重复,但您可能会在[此问题及其答案]中找到有用的内容(https://stackoverflow.com/questions/17252669/rails-query-with-select-group-and -having-不会工作)。此外,使您的协会双向。 – anothermh

回答

1

既然你正试图获得有关用户的详细信息,您可能要定义您的用户模型是这样的关系:

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 
+0

我不认为你需要'.joins'和'.includes'。我认为只有'.includes'才能完成这项工作。 – moveson

+1

'.joins'对于仅考虑队长的用户是必要的。 – cschroed

+0

这就是铁轨的方式!通过“ActiveRecord”控制表上的查询,尽可能简化查询。 –

0

sql = "**Select count then group by then having count(...)**"

结果= ActiveRecord的:: Base.connection.execute(SQL);

你可以使用原始的sql来得到你想要的。

相关问题