2017-11-11 6 views
0

을 감안할 때 레일 응용 프로그램 :카운트 별개의 기록하면서

[[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

당신이 사용자에 대한 자세한 정보를 얻으려고 노력하고 있기 때문에, 당신은 당신의 사용자 모델에 이런 관계를 정의 할 수 있습니다 :

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(...)**"

결과 :: = 액티브 Base.connection.execute (SQL);

원시 SQL을 사용하여 원하는 것을 얻을 수 있습니다.