밑에 Task
모델에 find
를 사용하는 코드가 있습니다.
class TaskController < ApplicationController
def index
@tasks = Task.find_all_by_complete(:false, :order => "created_at DESC")
end
end
어플에서 find
가 여러번 사용되면 코드의 중복이 발생합니다. 중복을 제거하는 방법은 많이 있지만, 그중 하나는 find를 우리가 부를 모델 안에 구현하는 것입니다.
@tasks = Task.find_incomplete
컨트롤러에서 이렇게 하려면, 모델 안에 새로운 함수를 만들어야 합니다. 그 함수는 클래스 함수로 구현 되어야 하므로 반드시 self
로 시작해야합니다.
class Task < ActiveRecord::Base
belongs_to :project
def self.find_incomplete
find_all_by_complete(:false, :order => "created_at DESC")
end
end
find
를 구현 할때,find
는 Task
클래스의 범주안이기 때문에 Task
를 생략해도 됩니다. 이제 어디든 필요한곳에 Task.find_incomplete
를 사용할 수 있게 되었습니다.심지어는 연결관계 이후에도 사용할 수 있어서 Project
의 완료안된 테스크를 찾을때 다음과 같은 구현도 가능합니다:
class ProjectsController < ApplicationController
def show
@project = Project.find(params[:id])
@tasks = @project.tasks.find_incomplete
end
end