2013-07-31 2 views
0

나는이 다음 모델 :레일 : 조인 된 테이블에 수와 그룹

Car: 
has_many :car_classes 

CarClass: 
belongs_to :Car 
belongs_to :CarMainClass 

CarMainClass: 
has_many :car_classes 

내가하고 싶은 것이있는 main_class_symbol에 연결 한 후 car_main_class_id로 그룹화하지만 CarClass에있는 차의 양을 계산하는 것입니다 CarMainClass에서.

내가 지금 가지고있는 쿼리는 다음과 같습니다

CarClass.group(:car_main_class_id).count(:car_id) => {43=>79, 45=>4 ...} 

I 만에 끝낼 것을 제외하고 내가 원하는 거의 무엇을 어느 : CarMainClass에서 main_class_symbol :

{"A1"=>79, "A2"=>4 ...} 
내가 될 car_main_class_id

테이블과 사용자 정의 선택 옵션을 결합하려고했지만 작동하지 않았습니다.

메인 클래스를 반복 할 필요가없는 쿼리에서이 작업을 수행 할 수 있습니까?

많은 도움을 주셔서 감사합니다.

+0

모델 이름이 좋지 않습니다. CarMainClass가 CarCompany (또는 비슷한 것)라는 이름을 더 잘 지었습니까? – Tom

+0

안녕하세요 톰, 조언을 주셔서 고맙습니다. 사실 좀 더 일반적인 것으로 만들기 위해이 질문에서 이름을 변경했습니다. – Sobremesa

답변

1

SQL 접근 방식을 사용하고 "카운트/그룹 기준"을 사용하는 대신 레일스 ActiveRecords의 매우 간단한 기능인 counter_cache 열을 살펴보아야합니다.

예를 들어, 당신은 CarMainClass의 열 "car_classes_count"을 추가 할 수 있으며 CarClass 클래스에서, 당신은 다음과 같이 수행

CarClass: 
belongs_to :car 
belongs_to :car_main_class, :counter_cache => true 

당신은 자동차의 열 "car_class_count"와 동일한 기능을 수행 할 수 있습니다.

도움이 될지 모르겠지만 Rails로 개발하기 시작했을 때 같은 종류의 문제가있었습니다. 일부 실패한 미친 SQL 쿼리 (w/sqlite 작동하지만 w/postgres 않은 쿼리) 할 시도하고 마침내 다른 접근 방식을 선택합니다.

+0

고마워요. 나는 정말로 레일로 시작했습니다. 나는 이것을이 목적에 사용할 수 있을지 몰랐습니다! – Sobremesa

0

이 시도 :

CarClass.includes(:car_main_class => :car_classes) 
.group(:car_main_class_id).map { |cc| 
    { cc.car_main_class.main_class_symbol => cc.car_main_class.cars.size } 
} 

을이 매우 추한하지만 - 난 당신이 더 의미있는 클래스 이름을 생각하는 것을 시도해야 @ 톰에 동의합니다.

+0

감사합니다. Thilo! 이게 효과가있다! 결과를 통해 반복하지 않는 쿼리가 없다는 것을 알게되었습니다. 카운터 캐싱은 좋은 대답 인 것 같습니다. – Sobremesa

관련 문제