2009-11-12 3 views
2

에 has_many 관계의 수를 기반으로 인기있는 모델을 선택. 기본적으로,이 쿼리의 결과에서로드 소설 모델 싶어 : 나는 named_scope 사용하여 레일 2.3에서 할 몇 가지 귀여운 방법이있을거야내가 두 가지 모델이 레일

select p.novel_id, count(*) as count 
from pages p 
GROUP BY p.novel_id 
ORDER BY count DESC 

을, 그러나 나는 확실히이 동작하지 않습니다. 게다가 효과가 있다면 개가 천천히 움직일 것입니까?

나는 소설에서 page_count를 유지하는 것을 고려해 봤지만, 이는 (규칙, 정규화, 내 영혼) 무언가를 위반하는 것처럼 보입니다.

+0

카운터 캐시는이 작업을 수행하는 방법 중 하나이지만, 현시점에서는 활성 쿼리에서이 쿼리를 복제하는 방법을 제공하지 않습니다. –

답변

5

카운터 캐시처럼 보입니다. 소설 테이블 (색인 포함)에 page_count라는 열을 작성하면 레일스는 소설 모델 자체의 페이지 수를 캐시하므로 이러한 종류의 쿼리가 매우 쉽고 효율적입니다. 자세한 내용은이 문제에 허용되는 것으로 간주 소설에 counter_cache을 유지 the counter cache railscast

+0

나는이 계획을 진행했고, Rails가 제공 한 것을 알지 못했습니다. counter_cache가 있습니다. 지금은 효과가있을 것입니다. – gmoore

2

예, 꽤 느려질 것입니다. 소설에서 page_count를 캐시하는 것은 끔찍한 일이 아닙니다. 정규화는 성능에 영향을 줄 때까지 모두 훌륭합니다.

값 비싼 계산을 캐시하는 것이 대부분의 최적화의 핵심입니다.

1

을 확인하고 쿼리를 원조해야 들어

Novel 모델의 named_scope

class Novel < ActiveRecord::Base 
    named_scope :popular, :order => 'page_count desc' 
end 

class Page < ActiveRecord::Base 
    belongs_to :novel, :counter_cache => true 
end 

된다.

page.rb 으로는 수행

belongs_to :novel, :counter_cache => true 

그리고 당신의 novels 테이블에

pages_count 열을 넣어. 이것은 페이지를 만들 때 자동으로 증가하고 제거 할 때 감소합니다.

관련 문제