레일즈에서 association model의 값으로 정렬하기

조회수 1431회

레일즈의 복잡한 relation구조에서 어떻게 잘 정렬을 할지에 고민하다가 질문 남깁니다. 구현하고 싶은 내용은 다음과 같이 취미를 카테고리별로 표시하는겁니다.

  • 홍길동의 취미
    • 게임: 스타크레프트
    • 예체능: 수영
    • 수집: 우표수집
  • 김철수의 취미
    • 게임: LOL
    • 수집: 고지도수집, 우표수집

요구사항은 다음과 같습니다.

  1. 취미에는 카테고리가 있습니다. 수집/예체능/게임 등등
  2. 취미를 표시할 때는 카테고리에 따라 특정 순서대로 표시되어야 합니다. (게임 => 예체능 => 수집 순으로 표시)

그래서 User/HobbyCategory/Hobby 이렇게 3개의 주요 모델이 있고 다음과 같은 관계입니다.

  • HobbyCategory has_many Hobby
  • Hobby belongs_to HobbyCategory
  • User has_many Hobby(이 관계를 정의하기 위한 UserHobbies라는 relation table이 따로 있음)

이 때 어떤 User의 hobby를 HobbyCategory에 따라 하나씩 뿌려주려면 어떻게 해야 할까요? 지금은 hobby를 읽어온 다음 배열로 바꿔서 group_by를 이용해서 처리를 하고 있습니다.

user.hobbies.to_a.group_by{|hobby|hobby.hobby_category}.to_a.sort{|x,y|x[0].display_order <=> y[0].display_order}
  • user.hobbies.to_a 하면 일단 [LOL, 고지도수집, 우표수집]과 같은 배열이 되고
  • .group_by하면 {게임:[LOL], 수집:[고지도수집, 우표수집]}과 같은 형태로 바뀐 다음
  • .to_a하면 [ [게임,[LOL], [수집,[고지도수집, 우표수집] ]이 되고
  • 마지막으로 게임/수집 의 display_order라는 값으로 정렬해서 사용하고 있습니다.

그런데 배열을 hash로 바꿨다가 다시 배열로 했다가 하는게 뭔가 비효율적인것 같아서 더 좋은 방법을 찾고 있습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)