SQL для поиска отношения многие ко многим с acts_as_tsearch - PullRequest
1 голос
/ 23 апреля 2009

Я использую плагин act_as_tsearch для рельсов для полнотекстового поиска с Postgresql.

Здесь приведен пример поиска по нескольким таблицам: http://code.google.com/p/acts-as-tsearch/wiki/ActsAsTsearchMethod

Но это только отношения один-ко-многим. Я пытаюсь заставить его также искать связи «многие ко многим» (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')))"
      }
    }
  }

Я не уверен, как ссылаться на идентификатор страницы (куда я положил ???).

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 29 августа 2009

Ну, 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"
    }
  }
}

Это стандартный способ прохождения таблицы «многие ко многим» - просто начните с одной таблицы, присоединитесь к сопоставлению, а затем присоединитесь к другой таблице. Вуаля! Результаты многие ко многим!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...