2013-10-12 1 views
0

태그로 SO 검색을 원하므로 exists 쿼리가 필요하지만 여전히 모든 태그에 대해 왼쪽으로 조인해야합니다. 나는 몇 가지 접근법을 시도했고 아이디어가 없습니다.레일 ActiveRecord는 명명 된 범위의 태그로 질문 찾기

Qustion - 태그 관계 has_and_belongs_to_many 두 가지 방법을 통해 (즉 I 가지고 QuestionTags 소목 테이블)

예컨대

Question.join(:tags).where('tag.name = ?', tag_name).includes(:tags)

내가 무엇을해야 할이 기대하지만, 실제로는 단지 join으로 includes를 매쉬 난 그냥 기본적으로 내부 결합으로 끝낼.

Question.includes(:tags) 
    .where("exists (
       select 1 from questions_tags 
       where question_id = questions.id 
        and tag_id = (select id 
            from tags 
           where tags.name = ?))", tag_name) 

이 올바른 결과를 가져옵니다하지만이) 정말 못생긴와 b)로 다시 사용 중단 경고를 제공는 joinincludes 혼동하는 것 같다

중단 경고 : 그것은 당신처럼 보인다 는 문자열 SQL sn ippet에서 참조되는 열거 형 테이블 (질문 : 태그 중 )을 열렬하게 읽습니다. 예를 들어 :

Post.includes(:comments).where("comments.title = 'foo'") 

주 나는라는 이름의 범위로 다음을 작성하는 것을 시도하고있다.

질문이 명확하지 않은 경우 알려주십시오. 미리 감사드립니다.

+0

내가 왜 내부 조인 혼란 스러워요 솔직히 말해서 당신은 왜 태그를 결합하는 것은 당신을 위해 작동하지 않는 세부에서 더 많은 이동하시기 바랍니다 수 있습니다, 당신을 위해 충분하지 않습니다? –

+0

@EdgarsJekabsons 특정 태그로 태그 된 모든 질문 목록을 표시해야하지만 해당 목록 내에서 각 질문에 대해 모든 태그를 표시해야하므로 N + 1 조회를 피하십시오. 예 : 위의'sql' 태그를 클릭하여 필요한 것을하는 SO 페이지를보십시오. 내부 조인만으로는 각 질문에'sql' 태그 만 표시됩니다. – fearofawhackplanet

답변

1

OK, 알겠습니다. 나는 그것을하기위한 구문이 없다는 것을 안다. 이전에 대체 방법을 사용 했으므로 다음과 같이 할 수 있습니다.

또한 IN을 사용하는 대신이 하위 쿼리를 질문 테이블에 가입시킬 수도 있습니다. 또는 보석을 추가하는 것에 반대하지 않고 Postgres를 사용하는 경우이 gem을 사용하십시오. 고급 쿼리를 위해 정말 깔끔한 구문을 제공합니다.

+0

고마워요,이 작동하지만 다시는 사용 중단 경고를받습니다.이를 해결할 방법이 있습니까? – fearofawhackplanet

+0

혹시'where' 메소드 다음에 include를 추가하려고 했습니까? –

+0

예, 차이는 없습니다. 관련없는 include와 함께조차도 실제로이 경고를받습니다. 'Question.tagged ("sql"). includes (: votes)'. 나에게는 레일에 버그가있는 것처럼 보이는데, 나는'join '과'include'를 모두 가지고있는 쿼리에서 같은 문제를 겪고 있습니다. – fearofawhackplanet

0

사용 preload 대신 includes :

Question.preload(:tags).where("exists ....