5

对于我正在开发的 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_withacts_as_taggable_onwhereANDOR

我希望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_onmeta_search我也很乐意听到。:)

编辑: 我在不使用tagged_withor的情况下让它工作meta_search。它看起来像这样:

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

创建的查询很荒谬,所以我尝试了一条不同的路线:没有acts_as_taggable_onand 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])

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

4

2 回答 2

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

请享用

于 2011-07-08T17:28:51.730 回答
1

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

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

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

于 2011-04-24T00:05:37.390 回答