именованная область действия против find_by_sql (конкретный пример) - PullRequest
0 голосов
/ 04 декабря 2009

Просто из любопытства кто-нибудь знает лучший способ создания следующей коллекции с использованием именованных областей (в отличие от 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'])

1 Ответ

0 голосов
/ 04 декабря 2009

Я не проверял это, но думаю, что это сработает:

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

(Предыдущая версия моего ответа разбивает подвыбор на собственный запрос, который, я думаю, не нужен.)

...