복붙노트

[RUBY-ON-RAILS] 존재하지 않는 가입 기록을 찾기

RUBY-ON-RAILS

존재하지 않는 가입 기록을 찾기

나는 사용자가 그들에 투표 여부를 모든 질문을 제한하는 범위를 가지고있다. 모델에서 :

scope :answered_by, lambda {|u| joins(:votes).where("votes.user_id = ?", u.id) }
scope :unanswered_by, lambda {|u| joins(:votes).where("votes.user_id != ?", u.id) }

컨트롤러에서,이처럼 전화 :

@answered = Question.answered_by(current_user)
@unanswered = Question.unanswered_by(current_user)

unanswered_by 범위는 올바르지 않습니다. 나는 기본적으로 투표권이없는 경우 찾고 싶어요. 대신, 현재 사용자와 동일하지 않습니다 투표가있는 경우를 찾기 위해 노력하고있다. 모든 아이디어를 어떻게이 존재하지 않는 조인 모든 레코드를 반환하는?

해결법

  1. ==============================

    1.이 존재합니다 안티 - 세미 조인

    이 존재합니다 안티 - 세미 조인

    WHERE NOT EXISTS (
       SELECT 1
       FROM   votes v
       WHERE  v.some_id = base_table.some_id
       AND    v.user_id = ?
       )
    

    NOT이있는 사이 ... () (E) 및 NOT IN () (i)는 두 가지이다 :

    본질적으로, (NOT) EXISTS 대부분의 경우에 더 나은 선택입니다.

    귀하의 질의는 다음과 같이 수 :

    SELECT *
    FROM   questions q
    WHERE  NOT EXISTS (
        SELECT 1
        FROM   votes v 
        WHERE  v.question_id = q.id
        AND    v.user_id = ?
        )
    

    기본 쿼리에서 투표에 참여하지 마십시오. 즉, 노력을 무효화 할 것입니다.

    게다가 NOT이 / 좌 가입도 NULL IS 존재 NOT IN. 더 많은 구문이 관련 대답 변종 :

  2. ==============================

    2.이 시도하고 작동하는지 알려주세요

    이 시도하고 작동하는지 알려주세요

    EDIT-1

    scope :unanswered_questions, lambda { joins('LEFT OUTER JOIN votes ON questions.id = votes.question_id').where('votes.question_id IS NULL') }
    

    EDIT-2

    scope :unanswered_by, lambda {|u| where("questions.id NOT IN (SELECT votes.question_id from votes where votes.user_id = ?)",u.id) }
    
  3. ==============================

    3.내가 작성한 보석을 존재하는 당신이 원하는 경우 그리고 우아하고 레일 틱 방식으로 쿼리를 EXISTS, 당신은 사용할 수 있습니다 :

    내가 작성한 보석을 존재하는 당신이 원하는 경우 그리고 우아하고 레일 틱 방식으로 쿼리를 EXISTS, 당신은 사용할 수 있습니다 :

    Question.where_not_exists(:votes, user_id: current_user.id)
    

    물론, 당신은뿐만 아니라 그것의 범위를 만들 수 있습니다 :

    scope :unanswered_by, ->(user){ where_not_exists(:votes, user_id: user.id) }
    
  4. from https://stackoverflow.com/questions/14251180/find-records-where-join-doesnt-exist by cc-by-sa and MIT license