acts_as_list에서 scope를 사용하기

acts_as_list는 레일스에서 간편하게 모델에 리스트 구조를 도입하는데 사용할 수 있습니다.
레일스 API(1 2)를 참조하시면 보다 자세히 아실 수 있는데요, 오늘은 :scope를 보다 복잡하게 사용하는 방법을 알아보겠습니다.

제가 :scope를 응용하게된 이유는 게시판 순서를 정렬하기 위해서였습니다. 인턴 커뮤니티에는 여러개의 게시판이 있는데, category 필드를 이용해서 일반 게시판과 인수인계 게시판으로 분류해 두었습니다. 게시판 목록을 화면 오른쪽에 항상 띄워두는 디자인이었는데, 게시판 개수가 많아서 게시판 목록을 그리기 위해서 모든 게시판을 하나하나 순서대로 표시하도록 하였습니다. 문제는 순서를 바꾸는 일이 너무 귀찮다는 것이었습니다. acts_as_list를 이용하고 position을 지정해서 사용했는데, 관리자 화면에서 간단하게 게시판의 순서를 바꿔주고 싶었습니다. 문제는 category에 의해 두가지 분류로 게시판이 나뉜다는 것이지요.
class TodoList < ActiveRecord::Base
has_many :todo_items, :order => "position"
end

class TodoItem < ActiveRecord::Base
belongs_to :todo_list
acts_as_list :scope => :todo_list
end
위의 예제는 레일스 API에 있는 예제입니다. 위와 같이 사용하면 TodoItem을 리스트 구조로 사용하면서도 TodoList별로 순서를 유지하게 되지요.

인턴 게시판의 문제는 위의 예제처럼 has_many - belongs_to 관계가 없다는 것입니다. 그냥 category 필드로 분류가 되어있지요. 그래서 이리저리 고민하다 다음과 같이 썼습니다.

class Board < ActiveRecord::Base
  acts_as_list :scope => 'category = \'#{category}\''
end

네, category 필드별로 position을 따로잡겠다는 의미입니다.

여기서 주의해야할 것은 :scope를 지정할 때 쌍따옴표가 아닌 홑따옴표를 사용했다는 겁니다. 만약 여기서 쌍따옴표를 사용하면 category란 메소드가 없다며 애러를 냅니다. 홑따옴표로 #{category}부분을 온전히 넘겨줌으로써 ActiveRecord가 만들어내는 SQL문에 동적으로 삽입되도록 하는 것이 묘미입니다.

저는 관리자가 로그인 한 경우 게시판 오른쪽에 위쪽 화살표와 아래쪽 화살표를 두고 각각 move_higher, move_lower 메소드를 호출하게 하여 게시판 순서를 쉽게 바꾸도록 했습니다. 가장 위에 있는 게시판은 더이상 올라갈 곳이 없으니 first? 메소드를 사용해서 위쪽 화살표를 표시하는 조건문으로 사용했지요. 물론 아래쪽도 비슷하게 말이죠.

여기에 사용된 홑따옴표와 #{}를 이용한 :scope 지정은
has_many :boards, :conditions => 'id = #{special_id}'
와 같이 사용될 수도 있습니다. SQL로 변환되는 곳에서 응용해서 사용해보세요.
by 정목 | 2007/02/14 02:15 | Ruby & Rails | 트랙백 | 덧글(0)
트랙백 주소 : http://niceview.egloos.com/tb/2996858
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글