Простой поиск с использованием атрибута И act_as_taggable - PullRequest
4 голосов
/ 12 февраля 2012

Я создаю приложение, в котором я хотел бы использовать простой поиск для поиска по названию объекта и тегам AND (с использованием act_as_taggable_on) в одном поиске

Я могу построить и то, и другое, но не то и другое, и в конце концов я пытаюсь понять это.

Для поиска по тегам я использую:

@post = Post.tagged_with(params[:search])

Для поиска объекта я использую:

@post = Post.search(params[:search])

И я написал метод под названием search в модели Post следующим образом:

def self.search(search)
  if search 
     where('question LIKE ?', "%#{search}%")
   else
     scoped
   end
end

Есть идеи, как объединить эти два запроса? Любые попытки до сих пор не увенчались успехом, главным образом потому, что в моей модели Post нет столбца «tag» и т. Д.

Ответы [ 3 ]

2 голосов
/ 27 февраля 2012

Я понял это и протестировал его в своем решении, я сам написал соединения, чтобы они не были такими чистыми, как хотелось бы, поэтому, если у кого-то есть лучшее решение, я все равно хотел бы увидеть его.Вот что я придумал:

q = "%#{search}%"
        Post.select('distinct posts.*').joins("LEFT JOIN taggings on posts.id = taggings.taggable_id")
        .joins("LEFT JOIN tags on tags.id = taggings.tag_id")
        .where('title LIKE ? OR tags.name LIKE ?', q, q )

Это работает, как и ожидалось, в моих тестах.Я тестирую с тремя записями.У одного есть поисковый термин в заголовке, у другого есть только тег, а у третьего есть и заголовок, и тег, поэтому он не должен возвращать дубликаты.

Надеюсь, это поможет.

1 голос
/ 27 февраля 2012

Я нашел это: Форма поиска с act_as_taggable_on (Rails 3)

это может сработать, но я также делюсь своими результатами с гемом kaminari, поэтому при использовании этого подхода я получаю следующую ошибку:

undefined method `page' for []:Array

Так что это не сработает в моей ситуации. Я хотел бы найти решение с одним запросом, чтобы справиться со всем этим.

0 голосов
/ 15 августа 2014

В качестве продолжения кода Эндрю я использовал этот метод поиска в моей модели - просто добавив нечувствительность к регистру и сделав запрос post "title" немного более явным, поскольку моя модель фактически содержала атрибут name, который был неоднозначным.

def self.search(search)
  if search.present?
    q = "%#{search}%"
    Post.select('distinct posts.*').joins("LEFT JOIN taggings on posts.id = taggings.taggable_id")
      .joins("LEFT JOIN tags on tags.id = taggings.tag_id")
      .where('lower(posts.title) LIKE lower(?) OR lower(tags.name) LIKE lower(?)', q, q )
  else
    all
  end
end
...