/tmp/temp_textmate.mMBvpb:2: warning: variable $KCODE is no longer effective; ignored
이번 에피소드는 with_scope
에 관한 내용입니다. 밑의 Task
모델은 완료되지 않은 태스크를 값을 돌려주는 클래스 함수를 가지고 있습니다.
class Task < ActiveRecord::Base
belongs_to :project
def self.find_incomplete
find_all_by_complete(false, :order => 'created_at DESC')
end
end
이 함수는 TasksController
에서 사용할 수 있습니다.
class TasksController < ApplicationController
def index
@tasks = Task.find_incomplete
end
하지만, 다른 조건을 추가해서(예를 들면 첫 20개만 가져온다던가) find
함수를 사용할 수 없다는 점에서 이 함수는 약간 재한적이라고 할 수 있습니다. 구채적으로 적어보면 다음과 같습니다.
@tasks = Task.find_incomplete :limit => 20
이것을 하는 방법은 여러가지가 있지만 find_incomplete
함수에 해쉬로 인자를 붙여서 해결할 수도 있습니다. 하지만, find_scope
를 사용하면 좀더 우아하게 find
조건을 넘겨줄수 있습니다.
class Task < ActiveRecord::Base
belongs_to :project
def self.find_incomplete(options = {})
with_scope :find => options do
find_all_by_complete(false, :order => 'created_at DESC')
end
end
end
with_scope
블록 안쪽에서 실행되는 어떤 find
도 자동으로 특정옵션을 상속 받게 됩니다. 이제 find_incomplete
는 어떤 조건도 전달 받을 수 있게 되었습니다. 이 함수는 다른 스코프가 없을때에도 문제없이 동작합니다. 이 함수는 ProjectsController
에서 부를 수 있고, 리미트 조건도 걸 수 있습니다. 이 find
는 2가지 스코프를 거쳐서 동작합니다: 완료안된 테스크는 1.특정 프로젝트 범위내에서, 2.상위의 20개만 가져옵니다.
@tasks = @project.tasks.find_incomplete :limit => 20