2010-06-19 3 views
1

사용자 프로필에 가장 인기있는 활동 섹션을 만들고 있습니다. user_id를 통해 질문을 당기는 데 어려움이 없지만 연관된 정수를 순서대로 가져 오는 데 문제가 있습니다. question.votes.size. 이것은 아마도 간단한 질문 일 뿐이지 만 출력을 3으로 제한하는 방법은 무엇입니까? 데이터베이스를 뒤처지지 않고 어떻게이 작업을 수행 할 수 있습니까? 결국에는 많은 표를 얻게 될 것입니다. 이것이 named_scope일까요?Ruby on Rails에서 배열을 연결된 정수로 어떻게 정렬합니까?

@user_id = User.find_by_username(params[:username]).id 
    questions = Question.find(:all, :conditions => {:user_id => @user_id }) 

답변

2

(내가 그것을 테스트하지 않았다)이 거의 비슷

Question.find_by_sql(" 
    SELECT question.*, COUNT(votes.id) as vote_count 
    FROM questions 
    LEFT JOIN votes on questions.id = votes.question_id 
    GROUP BY questions.id 
    ORDER BY vote_count DESC 
"); 

이나 뭐하는을 사용하여이 작업을 수행 할 수 있습니다 조금 더 원시 RoR. :-)

@user = user.quindions.sort {| q1, q2 | 이것은 장점이있다

q2.votes.length < => q1.votes.length} :

1) 기록 없음 SQL은 DB의 휴대 성을 유지, 쉽게 (읽기) 2) DB를 해소? 잠재적 장점 # 2를 완화, 2) 더 많은 데이터를 이동 한 상자에

1) 낮은 부하에서 열심히 루비, 높은 대기 시간을 작동, 덜 효율적 : 종류의 더 나은

과 단점의 몇 확장한다, 계산

ActiveRecord의 카운터 캐시 기능을 살펴 보는 것이 가장 이상적입니다. 하위 행 수를 부모 테이블로 역 정규화하여 관계 수를 자동으로 캐시합니다. 이 작업을 수행하려면 모든 하위 행 조작이 상위 오브젝트를 통해 이루어져야하지만, 이는 Rails의 모범 사례입니다.

질문에 투표 카운터 캐시가 있으면 쿼리에서 투표 테이블을 참조 할 필요가 없습니다. 이렇게하고 Ruby에서 정렬하면 성능과 코드 심미적 인 측면 모두에서 이상적인 상황이 될 수 있습니다.

마지막으로, Rails 3의 매우 멋진 관계형 대수에 대해 말을 걸어야합니다. 이를 통해 최적의 SQL을 생성하는 독해 가능한 한 줄짜리 라이너가 될 수 있습니다. 얼마나 시원할까요? :-)

+0

안녕하세요 톰! 귀하의 회신에 감사 드리며, 효과가있었습니다. 하나의 빠른 트위스트, 어떻게 출력을 제한 할 수 있습니까? 나는 3 entires 그것을 유지하고 싶습니다. – user250181

+1

첫 번째 세 가지 질문을 정렬하려면 정렬 한 후'@sorted_questions = @ user.questions.sort {| q1, q2 | q2.votes.length <=> q1.votes.length} .first (3)' – Chubas

1

각 질문마다 투표 수가 많다고 가정합니다.

당신은 내가 아마도, 또 다른 방법으로 팝업 제안하고 싶었다

+0

답장을 보내 주셔서 감사합니다.이 코드를 추가했지만 부분적으로 질문에서 속성을 가져 오려고하면 오류가 발생합니다. 그것은 저에게 준다 : missing attribute : message. 어떤 아이디어? – user250181

+0

와우 : 'FROM questions'대신 'FROM votes'를 받았습니다. 그것을 밖으로 시도하십시오. 문법적으로 정확한지 아직 확실하지 않습니다. –

+0

씰링 오류가 발생합니다. – user250181

관련 문제