2013-10-10 3 views
0

나는 '질문 및 답변'포럼을위한 레일 4 응용 프로그램을 만들고 있습니다. 모델 Micropost가 있습니다. 질문과 대답으로 다른 마이크로 포스트를 연결하는 questionAnswer라는 모델이 있습니다.두 개의 왼쪽 외부 조인 쿼리 모호한 열 이름

Class Micropost < ActiveRecord::Base 
    has_many question_answers, foreign_key: "question_id" 
    has_many answers, through: :question_answers 
    has_one :reverse_question_answer, foreign_key: "answer_id", class_name: "QuestionAnswer" 
    has_one :question, through: :reverse_question_answer 
end 

Class QuestionAnswer < ActiveRecord::Base 
    belongs_to :question, class_name: "Micropost" 
    belongs_to :answer, class_name: "Micropost" 
end 

이제 데이터베이스 쿼리를 수행하고 싶습니다. 나는 두 번째에 답변 micropost 교체 위의 명령을 조인

SQLite3::SQLException: ambiguous column name: microposts.id SELECT "microposts".* FROM "microposts" LEFT OUTER JOIN question_answers ON question_answers.question_id = microposts.id LEFT OUTER JOIN microposts ON microposts.id = question_answers.answer_id ORDER BY created_at DESC 

Micropost. 
    joins('LEFT OUTER JOIN question_answers ON question_answers.question_id = microposts.id'). 
    joins('LEFT OUTER JOIN microposts ON microposts.id = question_answers.answer_id') 

내가 오류 메시지가 나타납니다 : 나는 LEFT OUTER 모든 질문에 대한 답변과 공동 테이블을 만드는 조인이 사용하고자하는 그런 테이블이 없다고 불평한다. 어떻게 두 개의 조인을 할 수 있습니까? -감사.

+0

당신은 가입 한 고수하지만,이 FULL OUTER 가입하지할까요? like :'FULL OUTER JOIN question_answers ON question_answers.question_id = microposts.id' –

+0

답장을 보내 주셔서 감사합니다. 나는 전체 외부 조인을 할 수없는 SQLite3을 사용하고 있습니다. 또한 microposts (질문)에서 question_answers (답변으로) microposts로 이동하려는 때문에 두 조인이 필요합니다. – user2725109

+1

나는 다음과 같은 것을 시도해 볼 수 있겠는가? 'Micropost. 조인 ('LEFT OUTER JOIN question_answers a a.question_id = microposts.id'). 조인 ('LEFT OUTER JOIN 마이크로 포스트 m ON m.id = a.answer_id') ' –

답변

3

이 솔루션은 다음 코드 조각을 사용하는 것입니다 : 별명에 대한 질문으로 당

Micropost. 
    joins('LEFT OUTER JOIN question_answers a ON a.question_id = microposts.id'). 
    joins('LEFT OUTER JOIN microposts m ON m.id = a.answer_id') 

을의 a 별칭은 전체 question_answers 테이블을 의미합니다. 이 특정 예에서는 편의를위한 것입니다. 그러나 별칭은 microposts에 사용됩니다. 여기

우리는 mmicroposts 표는 당신이 여기합니다 (microposts을 a.question_id = microposts.id를 사용하기 전에 합류 아닌 다른 테이블 있다는 신호에 대한 별명이 microposts 테이블의 첫 번째 '인스턴스'되는 것으로 정의하고, 다음에 가입하세요 당신은 m 별명을 부여하는 다른 인스턴스를 정의합니다. 나는 명확하게 설명하면

확실하지, 이쪽을 봐 : 여기

SELECT e.name, mgr.name 
    FROM employees e 
    JOIN employees mgr ON (e.manager_id = mgr.id) 
; 

우리는 직원 테이블의 다시 두 개의 인스턴스가 - 우리가 직원의 이름과 그의 매니저의 이름을 얻기 위해 두 테이블에서 행을 가입 할 수 있습니다. 별칭은 여기에서 필요합니다. 그렇지 않으면 어느 열을 어떤 테이블에서 가져올 지 명확하지 않기 때문입니다.

http://www.w3schools.com/sql/sql_join.asp

을 또는 (잘 표시와 설명, 조인에 대한 자세한 링크는 당신에게 도움이 될 것입니다 희망이 있습니다) : 당신이 가입에 대한 자세한 내용을 원하시면

, 당신은 읽을 수 있습니다 :

What is the difference between "INNER JOIN" and "OUTER JOIN"?