我遇到了一个小问题,我正在开发一个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])
效果很好,查询也很好。不过,如果有人知道更好的方法:请告诉我。它也可能对通过谷歌来到这里的人有所帮助。
答案 0 :(得分:7)
Post.metasearch({:title_or_tag_taggings_tag_name_contains => params[:search]})
享受
答案 1 :(得分:1)
我认为您正在研究的解决方案是使用数据库VIEW作为新模型。
您可以创建包含连接表Post和Tags的视图。
然后你可以使用meta_search搜索它,没有问题。