2011-03-01 3 views
1

My Rails db 스키마에는 프로젝트와 태스크가 있습니다. 적어도 하나의 열린 작업이있는 프로젝트를 보여주고 싶습니다.레일 3 : 서브 모델에 특정 조건이있는 모든 서브 모델을 선택하십시오.

class Project 
    scope :open_tasks, lambda { 
     where(:tasks => {:finished => false}).includes(:tasks) 
    } 
    ... 
end 

이 코드가 제대로 일 열린 작업과 프로젝트를 반환하지만 단지 하나의 개방 작업과 모든과 : 이것은 내 코드입니다. 예 : 프로젝트는 총 5 개의 작업과 2 개의 열린 작업을 가지고 있으며 위의 코드는 2 개의 작업으로 만 프로젝트를 반환합니다. 나는 단순히 프로젝트를 다시로드하도록 강요 할 수 있다는 것을 알고 있지만 이것은 매우 해킹되어 성능 문제가 있습니다. 모든 작업으로 프로젝트를 가져올 수 있습니까?

답변

1

where 조건은 항상 반환되는 관련 작업을 제한합니다.

적어도 하나의 작업이 완료되지 않은 경우 상태와 관계없이 프로젝트를 반환하고 의 모든 관련 작업이 들리는 것 같습니다.

당신은 이것을 시도 할 수 있습니다 (나는 여러분이 여러분의 범위에서 어떤 변수/시간/등을 사용하지 않기 때문에 람다가 필요 없다고 생각합니다). has_many :tasksbelongs_to :project이 있다고 가정합니다. has_many : through 등을 사용하는 경우이 설정을 조정해야합니다.

scope :open_tasks, where("(select count(*) from tasks where tasks.project_id=projects.id) > 0").includes(:tasks) 
+0

안녕하세요, 람다는 이전 테스트의 값입니다. 솔루션이 작동합니다. – hjuskewycz

관련 문제