Объединение meta_search с act_as_taggable_on - PullRequest
5 голосов
/ 23 апреля 2011

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

class Post < ActiveRecord::Base
  acts_as_taggable
end

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

@posts = Post.tagged_with("rails")

Дело в том, что я также хочу найти название сообщения.Когда у меня есть пост с названием «Hello world» и помеченный как «rails», я хочу найти этот пост, выполнив поиск «hello» или «rails».Поэтому я хочу оператор LIKE для столбца заголовка в сочетании с предоставленным 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 или 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.

Ответы [ 2 ]

7 голосов
/ 08 июля 2011
Post.metasearch({:title_or_tag_taggings_tag_name_contains => params[:search]})

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

1 голос
/ 24 апреля 2011

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

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

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

...