레일즈 어플에서 테스크를 여럿 가지고있는(has_many
) Project
모델이 있습니다:
class Project < ActiveRecord::Base
has_many :tasks
end
그리고 프로젝트에 속한(belongs_to
) Task
모델이 있습니다:
class Task < ActiveRecord::Base
belongs_to :project
end
이 프로젝트의 컨트롤러 함수로 show
액션이있고, Project
와 함께 프로젝트가 포함하고있는 완료안된 Task
를 표시하고 싶습니다. 이렇게 하려면Task
모델에 project_id
가 Project
의 아이디와 같고 complete
가 false
가 되도록 조건을 걸 find
를 해야합니다.
class ProjectsController < ApplicationController
def show
@project = Project.find(params[:id])
@tasks = Task.find(:all, :conditions => ['project_id = ? AND complete = ?', @project.id, false])
end
end
좀 더 나은 방법이 있습니다.find
문은 결합(association)을 통해 표현할 수 있습니다. 밑의 줄의 코드는
@tasks = Task.find(:all, :conditions => ['project_id = ? AND complete = ?', @project.id, false])
좀 더 간략하게 밑의 코드로 바꿀수있습니다.
@tasks = @project.tasks.find(:all, :conditions => [complete = ?', false])
프로젝트에서 테스크를 연결했을때 이미 project_id
가 정의 되어있기 때문에, find
에서 project_id
를 지울 수 있습니다.
프로젝트의 범위내에서 동적 find 함수를 사용하면 훨씬 더 짧은 문장을 만들 수도 있습니다:
@tasks = @project.tasks.find_all_by_complete(false)