0

레일 (5)에서 나는 다음과 협회를 통해 has_many와 그룹을 사용할 수 없습니다 : 나는 학교에 의해 조직 된 학생의 목록을 얻기 위해 노력하고

class Student < ApplicationRecord 
    has_many :people_schools 
    has_many :schools, through: :people_schools 
end 

class PeopleSchool < ApplicationRecord 
    belongs_to :student 
    belongs_to :school 
end 

class School < ApplicationRecord 
    has_many :people_schools 
    has_many :students, through: :people_schools 
end 

. 나는 시도 다음

Student.joins(:schools).all.group('schools.name') 

그러나 나는 다음과 같은 오류 얻을 : 나는이 문제를 해결하려면 어떻게

ActiveRecord::StatementInvalid: PG::GroupingError: ERROR: column "students.id" must appear in the GROUP BY clause or be used in an aggregate function 

를?

+0

학생은 많은 학교 ('has_many : 학교')의 학생이거나 항상 단 하나의 학생 ('has_one : 학교')이어야합니까? 아니면 조인 테이블이없는 'belongs_to : school'입니까? – ulferts

답변

0

연관 화재, 그것은 또는 집계 그룹화 컬럼 (예 MAX, MIN)의만을 포함 할 그룹화 할 때, 돌기 (일부) SQL에서

SELECT students.id, students. ... 
FROM students 
JOIN schools 
ON ... 
GROUP BY schools.name 

같은 SQL 쿼리를 생성하면 열 (그룹화 여부에 관계없이).

# column that is grouped by 
Student.joins(:schools).group('schools.name').select('schools.name') 
# aggregate function 
Student.joins(:schools).group('schools.name').select('schools.name, COUNT(students.id)') 

을하지만 어떻게 당신이 당신의 케이스에 고정 할 것은 쿼리에서 얻을하려는 작업에 따라 달라집니다 따라서 유효한 SQL으로 바꿀 것입니다 다음과 같은 것을 추가. 학생 가정 주석

된 답변

은 (조인 테이블없이)는 belongs_to :school에 연결을 변경 필요 하나 학교의 구성원이거나 (테이블 조인 포함) has_one :school.

Student.includes(:school).group_by(&:school) 

이렇게하면 모든 학생과 학교 (최적화를 위해 열심히로드 됨)를 얻는 SQL 문이 실행됩니다. 모델 (Student, School)이 인스턴스화 된 루비 객체 인 경우에만 group_by 메소드가 평가되며 이는 학교가 학생 배열을 참조하는 키인 해시를 반환합니다.

+0

12 개의 학교가 있습니다. 배열 12 배열을 가져 오려고합니다. 각 12 개의 배열에는 각 학교 학생이 있습니다. 전에 has_many없이 group_by를 사용했습니다. – Philip7899