2012-03-26 3 views
3

매우 간단한 관계형 데이터베이스를 가진 매우 간단한 Rails 앱이 있습니다. 카테고리에는 많은 샘플이 있습니다. X 번호의 샘플이있는 범주를로드하기 만하면됩니다. 그런데, 잘 작동(다소 복잡한) 원시 SQL 쿼리를 ActiveRecord/Arel로 변환 하시겠습니까?

SELECT 
    categories.* 
FROM 
    categories 
JOIN 
    (SELECT 
     category_id, COUNT(*) as sample_count 
    FROM 
     samples 
    GROUP BY 
     category_id 
    ) AS subselect 
ON 
    categories.id=subselect.category_id 
WHERE 
    subselect.sample_count = X; -- where X is whatever 

을하지만 원시 SQL을 사용하는 것이 몹시 레일 같은 아니에요 :

일반 SQL에서 나는 같은 것을 할 것입니다. 그리고 분명히 그 범주를 모델 인스턴스로 가져오고 싶습니다.

어떻게하면 ActiveRecord 또는 Arel 쿼리에 다시 쓰려고할까요? 심지어 실현 가능한가, 아니면 일반 SQL을 사용해야합니까? 아마도 그 일을 아주 간단하게하는 방법이 있을까요? 이 페이지에 설명 된대로

답변

1

가능한 좋은 방법은, counter_cache을 사용하는 것입니다 : http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

당신의 분류 모델에 열 이름 samples_count 추가 : 샘플 모델 업데이트에서

add_column :categories, :samples_count, :integer 

다음과 같이 belongs_to :

belongs_to :category , :counter_cache => true 

이제 예를 들어, 조건으로 수를 사용할 수 있습니다

,
Category.where(:samples_count => 7) 
+0

아, 아주 멋지고 깨끗합니다! 범주에'samples_count' 컬럼을 추가하려고 생각하고 있었지만 Rails가 최신 정보를 유지하기 위해 로직을 내장하고 있는지 알지 못했습니다. 그 자신을 쓰고 싶지 않았어, 그래서 그것을 추구하지 않았다 :) – Flambino