2017-12-06 8 views
0

활성 레코드 조인을 수행하는 방법에 혼란스러워합니다. 세 가지 모델 인 User, Task 및 Response가 있습니다. 사용자가 작업에 대한 응답을 제출합니다. 나는 ActiveRecord에서 has_many, through : 패턴을 사용하고있다. 댄 적은 계산ActiveRecord 쿼리 : 하위 쿼리에서 외부 필드에 액세스

  1. 가 응답을 가지고 : response_limit 필드를
  2. 작업에 일반 영어
    class Task < ApplicationRecord 
        has_many :users, through: :responses 
        has_many :responses 
        validates :response_limit, presence: true 
    
    class User < ApplicationRecord 
        has_many :responses 
        has_many :tasks, through: :responses 
    
    class Response < ApplicationRecord 
        belongs_to :task, optional: false 
        belongs_to :user, optional: false 
    

    , 나는 쿼리를 주어진 쿼리를 만들 싶습니다, 모든 작업을 반환 사용자가 이미 응답하지 않았습니다.

이전 질문에서 얻은이 중첩 된 쿼리로 # 2를 만족시킬 수 있습니다.

Task.where.not(id: Response.select(:task_id).where(user_id: params[:user_id])) 

그러나 첫 번째 문제는 만족스럽지 않습니다. 나는 그것을 자상에 갔다이있어 :

Task.where.not(id: Response.select(:task_id).where(user_id: params[:user_id])).where('response_limit > (?)', Response.where(task_id:task.id).count) 

내 문제는 내가 응답 하위 쿼리에 외부 쿼리에서 TASK_ID을 얻을하는 방법을 잘 모르겠어요 것입니다. 이를 위해

답변

1

, 당신은 응답을 계산하고 조건에 따라 그들을 필터링 도움이 될 것입니다 절을 SQL의 GROUP BY를 사용하고 HAVING 시도 할 수 있습니다

+0

거의 완벽합니다. 내가 바꾸어야 만 한 것은 조인을 left_outer_joins로 바꾸고 .distinct를 추가하는 것입니다. 조인을하면 응답이없는 작업을 반환하지 않기 때문입니다. 그 외 멋진 답변! :) – JCDJulian

1

할 수 있습니다

하여 작업에 대한 응답의 수
Task.response.count 

다음은 작업의 response_limit와 비교하십시오.

관련 문제