CASE를 이용해서 정렬(일반적인 정렬 X)

상황

길드에는 세 개의 클래스가 존재한다. master, officer, member

프론트에서 백엔드에 현재 길드의 유저 정보를 요청하는데, 그 유저들이 클래스로 정렬되어 있기를 원할 때는 어떻게 해야하는가?

해결

CASE 를 사용하자!!

실제 사용된 코드는 아래와 같다.

def self.priority_order
  self.order(
    # A Relational Algebra
    Arel.sql(<<-SQL.squish
      CASE
      WHEN position = 'master' THEN '1'
      WHEN position = 'officer' THEN '2'
      WHEN position = 'member' THEN '3'
      END
      SQL
      )
    )
end

# 이후에는 아래처럼 사용하면 된다.
def self.for_members_ranking(guild_id, page)
  self.where(guild_id: guild_id).priority_order.page(page).map {                 |membership|
        membership.user.profile
    }
end

여기서 주의할 건 Arel.sql(<<) 문인데, 이 부분은 레일즈 버전이 업 되면서 추가된 부분이다.

Last updated