代码之家  ›  专栏  ›  技术社区  ›  Alex B.

命名作用域与按SQL查找的作用域(特定示例)

  •  0
  • Alex B.  · 技术社区  · 15 年前

    出于好奇,是否有人知道使用命名范围(而不是通过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'])
    
    1 回复  |  直到 15 年前
        1
  •  0
  •   Jordan Running    15 年前

    我还没有测试过这个,但我认为它会起作用:

    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"
                          }
                        ]
      }    
    }
    

    (以前版本的答案将子选择分解为自己的查询,我认为这是不必要的。)