2017-11-11 10 views
0

考えるのRailsアプリ:カウント明確な記録ながら

[[23, "Pat", "Smith"]] Teams: 1 
[[46, "Kate", "Jones"]] Teams: 1 
[[107, "John", "Doe"]] Teams: 3 
... 
:私は簡潔にデータベースを照会し、彼らが属するキャプテンの概要とチームの数を取得しようとしている

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

私は、各キャプテンの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-wont-work)である。また、あなたの関係を双方向にする。 – anothermh

答えて

1

あなたはユーザーに関する詳細な情報を取得しようとしているので、あなたはUserモデルにこのような関係を定義することもできます。

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)。

raw SQLを使用すると、必要なものを取得できます。

関連する問題