Сочетание meta_search с act_as_taggable_on

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

class Post < ActiveRecord::Base
  acts_as_taggable
end

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

@posts = Post.tagged_with("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, я бы тоже хотел это услышать. :)

EDIT: я заработал без использования tagged_with или 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. Я сам создал таблицу тегов и подключил ее к постам с 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.


person RobinBrouwer    schedule 23.04.2011    source источник
comment
Я обновил вопрос, как я его решил. В конце концов я просто отказался от act_as_taggable и meta_search. Может быть, вы могли бы попробовать ответ Сержа. Если это сработает, я отмечу это как ответ. :)   -  person RobinBrouwer    schedule 08.08.2011


Ответы (2)


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

наслаждаться

person Serge White    schedule 08.07.2011
comment
Я только что проверил, работает ли это в моем старом проекте, и это работает! Поэтому я отмечаю это как ответ. Спасибо. :) - person RobinBrouwer; 10.08.2011

Я думаю, что решение, которое вы ищете, использует базу данных VIEW в качестве новой модели.

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

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

person Esse    schedule 24.04.2011