정렬 기능 추가하기

Red_Panda·2021년 4월 8일
0
post-thumbnail

이제 책의 기능 구현 목차중에서 진짜진짜 마지막이다.
처음 시작할때 양이 많아보여 도중에 그만두지않고 끝까지 갈수있을지 막막했는데 꾸준히 하다보니까 끝까지 와서 기쁘다.

오늘 정렬기능을 추가하고, 여기서 배웠던 내용을 토대로 나만의 기능을 하나씩 추가해야겠다.

책에서는 최신순, 추천순, 인기순 3가지 기준으로 정렬한다. 나는 여기에 최신순을 응용해서 오래된순도 넣어보겠다.



먼저 question_list.html의 div 엘리먼트를 end -> between으로 수정해 양쪽 정렬로 변경 후 4가지 정렬 조건을 넣었다. select 엘리먼트의 class를 so로 지정해, 현재 선택된 정렬 기준을 읽을 수 있도록 했다.

그리고 question_list.html의 searchForm에 정렬 기준을 입력할 수 있게 input 엘리먼트를 추가했다.

$(".so").on('change', function() {
        $("#so").val($(this).val());
        $("#page").val(1);
        $("#searchForm").submit();
    });

그리고 정렬 기준 콤보박스가 변경될때 searchForm 요청이 발생하도록 jQuery 자바스크립트를 추가했다.

recommend는 추천순이다. 추천숫자가 높을수록 위로 온다. 서브쿼리를 이용해 질문별 추천수를 알기위해 만들었다.

sub_query = db.session.query(question_voter.c.question_id, func.count('*').label('num_voter')) \
            .group_by(question_voter.c.question_id).subquery()

question_voter.c.question_id : Question 모델과 조인하기위해 추천이 달린 질문글들의 question_id를 저장
func.count('*').label('num_voter') : 질문별 추천수를 세고, 이 추천수를 num_voter로 저장
.group_by(question_voter.c.question_id) : 1질문에 n추천이 있으므로 각 질문을 기준으로 group_by 해서 질문당 몇개의 추천수가 있는지
.outerjoin(sub_query, Question.id == sub_query.c.question_id) : Question의 id랑 추천이 달린 질문글의 id가 같은경우 sub_query를 아우터조인 (일반 조인을 사용하면 추천이 달리지 않은 질문글은 제외됨)
.order_by(sub_query.c.num_voter.desc(), Question.create_date.desc()) : 추천수가 높은순으로 먼저나오고, 같은 추천수라면 작성일자가 최신순으로 나온다.



추천순, 오래된순, 인기순으로 잘 적용 됐다.

profile
신입 개발자

0개의 댓글