将meta_search与acts_as_taggable_on结合使用

时间:2011-04-23 19:36:41

标签: ruby-on-rails ruby acts-as-taggable-on meta-search

我遇到了一个小问题,我正在开发一个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,所以我可能在这里做错了。 ;)我读过searchlogicacts_as_taggable_on结合使用的某处,但由于它不支持Rails 3,我不能使用它。

我希望有人可以帮我解决这个问题。任何人都知道如何将acts_as_taggable_onmeta_search合并?或者可能知道没有meta_search的解决方案?此外,如果acts_as_taggable_on有更好的选项与meta_search一起使用,我也很乐意听到这一点。 :)

修改 我没有使用tagged_withmeta_search就让它工作了。它看起来像这样:

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

创建的查询非常荒谬,所以我尝试了另一条路线:没有acts_as_taggable_onmeta_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])

效果很好,查询也很好。不过,如果有人知道更好的方法:请告诉我。它也可能对通过谷歌来到这里的人有所帮助。

2 个答案:

答案 0 :(得分:7)

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

享受

答案 1 :(得分:1)

我认为您正在研究的解决方案是使用数据库VIEW作为新模型。

您可以创建包含连接表Post和Tags的视图。

然后你可以使用meta_search搜索它,没有问题。