2009-04-23 7 views
1

레일즈 용 acts_as_tsearch 플러그인을 사용하여 PostgreSQL에서 전체 텍스트 검색을 수행합니다.acts_as_tsearch와 많은 관계를 검색하는 SQL

그들은 여기에 멀티 테이블 검색의 예 제공 : http://code.google.com/p/acts-as-tsearch/wiki/ActsAsTsearchMethod

을하지만이 일대 다 관계를한다는 것을. 페이지의 태그에 대해 many-to-many 관계 (has_and_belongs_to_many 또는 habtm)를 검색하도록하려고합니다. 그러나 SQL은 충분히 발전하지 못했습니다. 여기

는 내가 지금까지있어 무엇 :

acts_as_tsearch :vectors => { 
    :fields => { 
     "a" => {:columns => ["pages.name"], :weight => 1.0}, 
     "b" => {:columns => ["pages.description"], :weight => 0.2}, 
     "c" => {:columns => ["tags.name"], :weight => 0.2} 
    }, 
    :tables => { 
     :tags => { 
     :from => "tags INNER JOIN taggings ON tags.id = taggings.tag_id", 
     :where => "((taggings.taggable_type = 'Page') AND (taggings.taggable_id = ???.id) AND ((taggings.context = 'tags')))" 
     } 
    } 
    } 

나는 (내가 ??? 어디다) 페이지 ID를 참조하는 방법을 모르겠어요.

도움 주셔서 감사합니다.

+0

taggable_id가 무엇에 사용되는지 설명 할 수 있습니까? – Andomar

+0

좋은 질문입니다. 미안하지만 설명해야합니다. 다형성이므로 taggable_id는 태그를 가질 수있는 모든 모델을 나타냅니다. 이 경우에는 내 페이지에만 태그가 있기 때문에 page_id라고 할 수 있지만 모든 모델에 태그가있을 수 있도록 다형성으로 만들었습니다. 기본적으로 "taggings"테이블은 페이지와 태그가 다 대다 관계를 연결하기위한 ID를 보유합니다. 당신의 도움을 주셔서 감사합니다! –

답변

1

글쎄,이 뒤에 SQL은 다음과 같습니다

select 
    p.name, 
    p.description, 
    t.name 
from 
    pages p 
    inner join taggings ts on 
     p.page_id = ts.taggable_id 
     and ts.taggable_type = 'Page' 
     and ts.context = 'tags' 
    inner join tags t on 
     ts.tag_id = t.tag_id 

그래서, 당신의 루비과 같습니다

acts_as_tsearch :vectors => { 
    :fields => { 
    "a" => {:columns => ["p.name"], :weight => 1.0}, 
    "b" => {:columns => ["p.description"], :weight => 0.2}, 
    "c" => {:columns => ["t.name"], :weight => 0.2} 
    }, 
    :tables => { 
    :tags => { 
     :from => "pages p 
     inner join taggings ts on 
      p.page_id = ts.taggable_id 
      and ts.taggable_type = 'Page' 
      and ts.context = 'tags' 
     inner join tags t on 
      ts.tag_id = t.tag_id" 
    } 
    } 
} 

이 다 대다 테이블을 통해 얻을 수있는 표준 방법입니다 - 한 테이블에서 시작하여 매핑을 조인 한 다음 다른 테이블에 조인하십시오. 빌라! 다 대 다 결과!

관련 문제