레일즈에서 association model의 값으로 정렬하기
조회수 1432회
레일즈의 복잡한 relation구조에서 어떻게 잘 정렬을 할지에 고민하다가 질문 남깁니다. 구현하고 싶은 내용은 다음과 같이 취미를 카테고리별로 표시하는겁니다.
- 홍길동의 취미
- 게임: 스타크레프트
- 예체능: 수영
- 수집: 우표수집
- 김철수의 취미
- 게임: LOL
- 수집: 고지도수집, 우표수집
요구사항은 다음과 같습니다.
- 취미에는 카테고리가 있습니다. 수집/예체능/게임 등등
- 취미를 표시할 때는 카테고리에 따라 특정 순서대로 표시되어야 합니다. (게임 => 예체능 => 수집 순으로 표시)
그래서 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로 바꿨다가 다시 배열로 했다가 하는게 뭔가 비효율적인것 같아서 더 좋은 방법을 찾고 있습니다.
댓글 입력