将meta_search与acts_as_taggable_on结合使用

Rob*_*wer 5 ruby ruby-on-rails acts-as-taggable-on meta-search

对于我正在开发的Rails 3网站,我遇到了一些搜索功能的小问题.我有一个Post看起来像这样的简单模型:

class Post < ActiveRecord::Base
  acts_as_taggable
end
Run Code Online (Sandbox Code Playgroud)

我正在使用acts_as_taggable_on我的帖子添加标签更容易一些.当我有一个标记为'rails'的帖子并且我执行以下操作时,一切正常:

@posts = Post.tagged_with("rails")
Run Code Online (Sandbox Code Playgroud)

事情是,我也想搜索帖子的标题.当我有一个标题为'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])
Run Code Online (Sandbox Code Playgroud)

它只是不识别'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])
Run Code Online (Sandbox Code Playgroud)

创建的查询很荒谬,所以我尝试了不同的路线:没有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) }
Run Code Online (Sandbox Code Playgroud)

现在我可以做以下事情:

Post.search(params[:search])
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*ite 7

Post.metasearch({:title_or_tag_taggings_tag_name_contains => params[:search]})
Run Code Online (Sandbox Code Playgroud)

请享用