2009-12-04 40 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

謝謝你,這正是我所需要的。唯一需要改變的是缺少的右括號 – 2009-12-04 16:22:20

+0

哇,我一直在ActiveRecord工作了一段時間,我從來沒有意識到你可以使用命名參數,而不是使用'?'的位置。這很酷。 – 2009-12-04 21:00:05