2011-01-07 2 views
1

간단한 범위 지정 질문이 있습니다. 그래서간단한 쿼리를 RoR에서 까다로운 명명 된 스코프로 변환

if article.responses.blank? 
     return false 
elsif article.responses.last.passed.eql?(false) 
     return true 
else 
    return false 
end 

나는이 같은 것 문서 모델에 : 나는 범위로이 작업을 수행하고자하는

scope :failed_response, { 
    :joins=>[:responses], 
    :conditions=>["responses.passed = ?", false] 
    } 

문제는, 내가 인스턴스 만 원하는을 어디에 가장 최근 응답이 실패했습니다. 이 방법은 환상적인 정렬이나 중첩 된 쿼리를 사용하여 수행하는 것이지만 확실하지는 않습니다. 감사! 나는 순간에 생각할 수

답변

1

유일한 것은이 범위 안에 하위 쿼리입니다 :

named_scope :failed_response, { 
    :conditions => ["(SELECT passed FROM responses WHERE 
    responses.article_id = articles.id ORDER BY id DESC LIMIT 1) = ?", false] 
} 

내가 조금 더 좋은 또는 하위 쿼리가없는 방법입니다 레일 방식의 일종이 생각하지만, 나는 그 순간을 생각할 수 없다. 희망이 비록 도움이됩니다. :)

0

나는 영리한 것보다 분명하게 말하고 싶습니다. 해당 개별 아티클에 대한 last_reponse를 반환하는 인스턴스 메서드를 가져온 다음 true 또는 false인지 여부에 대한 boolean을 반환하는 다른 인스턴스 메서드를 갖습니다. 단 한 줄의 SQL을 가진 이름 범위만큼 빠르지 않을 수도 있습니다. 그러나 나는 더 나은 유지 보수성/이해력을 위해 여전히 명확한 방법을 사용합니다.