2009-12-04 3 views
0

호기심에서 벗어난 사람이라면 누구나 명명 된 범위 (find_by_sql과 반대되는)를 사용하여 다음 모음을 작성하는 더 나은 방법을 알고 있습니까?명명 된 범위 대 find_by_sql (특정 예제)

@available = Workflow.find_by_sql([" 
     SELECT workflows.id FROM workflows 
     WHERE workflows.project_id = ? AND workflows.status < 5 AND 
     (workflows.created_by = ? OR workflows.id IN 
     (
      SELECT workflow_id FROM workflow_histories 
      INNER JOIN workflow_recipients on workflow_histories.id = workflow_recipients.workflow_history_id 
      WHERE workflow_recipients.recipient_id = ? AND workflow_recipients.recipient_type = ? 
     ) 
    )", project.id, @current_user.id, @current_user.id , 'USER']) 

답변

0

나는이 테스트를하지 않은,하지만 난 그것을 작동 것이라고 생각 :

named_scope :available, lambda { |user_id, project_id| 
    { :select => :id, 
    :conditions => [ "project_id = :project_id AND status < 5 AND 
         (created_by = :user_id OR id IN (
         SELECT workflow_id FROM workflow_histories 
         INNER JOIN workflow_recipients ON workflow_histories.id = workflow_recipients.workflow_history_id 
         WHERE workflow_recipients.recipient_id = :user_id AND workflow_recipients.recipient_type = :recipient_type 
         )", 
         { :user_id  => user_id, 
         :project_id  => project_id, 
         :recipient_type => "USER" 
         } 
        ] 
    }  
} 

(내 대답의 이전 버전은 내가 생각하는 자신의 쿼리로 밖으로 서브 - 선택 나누기 불필요한.)

+0

고마워, 그게 내가 필요한거야. 변경이 필요한 유일한 것은 닫는 괄호가 누락되었습니다. –

+0

와우, 지금 ActiveRecord로 작업 해 왔는데 '?'를 사용하여 위치 지정 대신 명명 된 매개 변수를 사용할 수 있다는 것을 결코 깨닫지 못했습니다. 멋지다. –