#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 без проблем.