2010-11-25 6 views
1

Ive 님이 그림 모델을 가지고 있습니다. 투표는 그림에 포함됩니다. 어떻게 모든 그림과 질서를 투표 수로 질의 할 수 있습니까? 이론 상으로는 가장 많은 표를 얻은 그림부터 시작하여 모든 그림을 나열하고 싶습니다.투표 수에 따라 그림을 나열하는 방법

참고 용입니다. 여기에 두 모델의 정의는 다음과 같습니다

class Painting 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :title, :type => String 

    embeds_many :votes 
    ... 
end 

class Vote 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    embedded_in :painting, :inverse_of => :votes 
    ... 
end 

답변

1

당신은 카운터 캐시 열를 사용하여 작업을 수행 할 수 있습니다. 여기에 언급 된 기능 (예 : http://railscasts.com/episodes/23-counter-cache-column)을 구현하면 paintings 테이블에 각 그림에 대한 투표 수를 보유한 votes_count 열이 포함됩니다.

다음 그림과 같이 투표 수로 그림을 주문하기 위해 named.scope를 손쉽게 추가 할 수 있습니다.

 

class Painting 
    named_scope :order_by_maximum_votes, :order => "votes_count DESC" 
end 
 

그럼 당신은 이런 식으로 같은 모든 그림을 가져올 수 :

@paintings = Painting.all.order_by_maximum_votes

+1

mongoid에 카운터 캐시 메커니즘이없는 경우 어떻게 받아들 나나요 ?? –

0

당신은 여전히 ​​하나 더 열을 추가 사용하지 않으려면 데이터베이스를 사용하면 다른 간단한 옵션을 사용할 수 있습니다. 데이터베이스에서 모든 그림을 가져온 다음 투표 수별로 정렬합니다.


# It fetches all paintings needed 
@paintings = Painting.all 
# Then sort them by number of votes 
@paintings = @paintings.sort {|p| p.votes.length} 
+0

NoMethodError : main : Object에 대해 정의되지 않은 메서드 인'sort '를 얻습니다. 내가 발견 한 (그리고 당신이 제안한) 또 다른 해결책은 총 득표 수를 추적하기 위해 여분의 열을 추가하는 것이 었습니다. –

+0

예. 정렬은 배열에서만 작동 할 수 있습니다. 그래서 @paintings가 배열을 가지고 있는지 확인해야합니다. 그런 다음 오류가 발생해서는 안됩니다. 그건 그렇고, 카운터 캐시 열을 사용하는 것도 좋은 방법입니다 :-) –

관련 문제