Объединение meta_search с acts_as_taggable_on

#ruby-on-rails #ruby #acts-as-taggable-on #meta-search

#ruby-on-rails #ruby #действует как помечаемый #метапоиск

Вопрос:

Я столкнулся с небольшой проблемой с некоторыми функциями поиска для веб-сайта Rails 3, который я разрабатываю. У меня есть простая Post модель, которая выглядит следующим образом:

 class Post < ActiveRecord::Base
  acts_as_taggable
end
  

Я использую acts_as_taggable_on , чтобы немного упростить добавление тегов к моим публикациям. Когда у меня есть сообщение с тегом ‘rails’, и я делаю следующее, все работает хорошо:

 @posts = Post.tagged_with("rails")
  

Дело в том, что я также хочу выполнить поиск по названию сообщения. Когда у меня появляется сообщение под названием «Привет, мир» с тегом «rails», я хочу иметь возможность найти это сообщение, выполнив поиск по ‘hello’ или ‘rails’. Итак, я хочу LIKE инструкцию для столбца title в сочетании с предоставляемым tagged_with методом acts_as_taggable_on . where Область видимости не работает, потому что она использует AND вместо OR .

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

 @search = Post.search(:tagged_with_or_title_like => params[:search])
@search = Post.search(:title_like => params[:search], :tagged_with => params[:search])
  

Он просто не распознает ‘tagged_with’. Я использую его впервые meta_search , поэтому, возможно, я делаю что-то не так. 😉 Я где-то читал, что это searchlogic работало в сочетании с acts_as_taggable_on , но поскольку оно не поддерживает Rails 3, я не могу это использовать.

Я надеялся, что кто-нибудь здесь сможет помочь мне с этой проблемой. Кто-нибудь знает, как объединить acts_as_taggable_on с meta_search ? Или, может быть, знаете решение без meta_search ? Кроме того, если есть лучший вариант для, acts_as_taggable_on который работает с meta_search , я бы тоже хотел это услышать. 🙂

РЕДАКТИРОВАТЬ: я заставил это работать без использования tagged_with or meta_search . Это выглядело так:

 Post.select("DISTINCT posts.*").joins(:base_tags).where("posts.title LIKE ? OR tags.name = ?", "%" params[:search] "%", params[:search])
  

Созданный запрос был нелепым, поэтому я попробовал другой маршрут: без acts_as_taggable_on и meta_search . Я сам создал таблицу тегов и подключил ее к posts с помощью has_and_belongs_to_many . У меня не будет других таблиц, которые нужно подключать к тегам, так что это сработает за меня. Я создал область для поиска как по тегам, так и по названию:

 scope :search, lambda { |search| select("DISTINCT posts.*").joins(:tags).where("posts.title LIKE ? OR tags.name = ?", "%" search "%", search) }
  

Теперь я могу сделать следующее:

 Post.search(params[:search])
  

Это отлично работает, и запрос тоже довольно приятный. Тем не менее, если кто-нибудь знает способ получше: пожалуйста, скажите мне. Это также может быть полезно для людей, приходящих сюда через Google.

Комментарии:

1. Я обновил вопрос, указав, как я его решил. В итоге я просто отбросил acts_as_taggable и meta_search. Может быть, вы могли бы попробовать ответ Сержа. Если это сработает, я отмечу это как ответ. 🙂

Ответ №1:

 Post.metasearch({:title_or_tag_taggings_tag_name_contains => params[:search]})
  

наслаждайтесь

Комментарии:

1. Я только что проверил, работает ли это в моем старом проекте, и это работает! Итак, я отмечаю это как ответ. Спасибо. 🙂

Ответ №2:

Я думаю, что решение, которое вы ищете, заключается в использовании ПРЕДСТАВЛЕНИЯ базы данных в качестве новой модели.

Вы можете создать представление, содержащее записи таблиц объединения и теги.

Затем вы можете искать его, используя meta_search без проблем.