(내가 그것을 테스트하지 않았다)이 거의 비슷
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을 생성하는 독해 가능한 한 줄짜리 라이너가 될 수 있습니다. 얼마나 시원할까요? :-)
안녕하세요 톰! 귀하의 회신에 감사 드리며, 효과가있었습니다. 하나의 빠른 트위스트, 어떻게 출력을 제한 할 수 있습니까? 나는 3 entires 그것을 유지하고 싶습니다. – user250181
첫 번째 세 가지 질문을 정렬하려면 정렬 한 후'@sorted_questions = @ user.questions.sort {| q1, q2 | q2.votes.length <=> q1.votes.length} .first (3)' – Chubas