2009-04-23 22 views
1

私は、postgresqlで全文検索を行うために、行にacts_as_tsearchプラグインを使用しています。acts_as_tsearchと多対多の関係を検索するSQL

彼らはここでは、マルチテーブル検索の例与える: http://code.google.com/p/acts-as-tsearch/wiki/ActsAsTsearchMethod

をしかし、唯一の1対多の関係をしていること。私はまた、ページ上のタグの多対多の関係(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と呼ばれることもありますが、どのモデルにもタグを付けることができるように多態性にしました。 基本的に、「タグ付け」テーブルはページとタグの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 

だから、あなたのRubyは次のようになります。

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" 
    } 
    } 
} 

これは多対多のテーブルを介して取得するための標準的な方法であります - 1つのテーブルから開始し、マッピングに参加してから、もう1つのテーブルに参加してください。 Voila!多対多の結果!