Ruby on rails 将元搜索与作为标记的行为相结合
我在开发Rails 3网站时遇到了一些搜索功能方面的小问题。我有一个简单的Ruby on rails 将元搜索与作为标记的行为相结合,ruby-on-rails,ruby,acts-as-taggable-on,meta-search,Ruby On Rails,Ruby,Acts As Taggable On,Meta Search,我在开发Rails 3网站时遇到了一些搜索功能方面的小问题。我有一个简单的Post模型,如下所示: class Post < ActiveRecord::Base acts_as_taggable end Post.select("DISTINCT posts.*").joins(:base_tags).where("posts.title LIKE ? OR tags.name = ?", "%"+params[:search]+"%", params[:search]) 问题是
Post
模型,如下所示:
class Post < ActiveRecord::Base
acts_as_taggable
end
Post.select("DISTINCT posts.*").joins(:base_tags).where("posts.title LIKE ? OR tags.name = ?", "%"+params[:search]+"%", params[:search])
问题是,我还想搜索帖子的标题。当我有一篇标题为“Hello world”并标记为“rails”的帖子时,我希望能够通过搜索“Hello”或“rails”来找到这篇帖子。因此,我希望标题列有一个类似于的语句,与
方法提供的标记相结合。where
范围不起作用,因为它使用和
而不是或
我希望meta\u 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
与作为标签一起工作,但由于它不支持Rails 3,所以我不能使用它
我希望这里有人能帮我解决这个问题。有人知道如何将作为标记与元搜索相结合吗?或者可能知道一个没有元搜索的解决方案
?另外,如果有更好的作为标记在上的选项与meta\u搜索一起使用
我也很乐意听到这一点
编辑:
我没有使用tagged\u with
或meta\u search
就能让它工作。看起来是这样的:
class Post < ActiveRecord::Base
acts_as_taggable
end
Post.select("DISTINCT posts.*").joins(:base_tags).where("posts.title LIKE ? OR tags.name = ?", "%"+params[:search]+"%", params[:search])
创建的查询很可笑,所以我尝试了另一种方法:不使用作为标记在上和元搜索。我自己创建了一个标签表,并将其连接到带有has\u和\u-beliens\u-to\u-many
的帖子。我不会有其他表需要连接到标记,所以这对我来说就足够了。我创建了一个搜索标记和标题的范围:
scope :search, lambda { |search| select("DISTINCT posts.*").joins(:tags).where("posts.title LIKE ? OR tags.name = ?", "%"+search+"%", search) }
现在,我可以执行以下操作:
Post.search(params[:search])
它工作得很好,查询也很好。不过,如果有人知道更好的方法:请告诉我。它也可能对通过谷歌来到这里的人们有所帮助。我认为您正在研究的解决方案是使用数据库视图作为新模型
您可以创建包含联接表和Post标记的视图
然后,您可以使用meta_搜索来搜索它,没有问题
Post.metasearch({:title_or_tag_taggings_tag_name_contains => params[:search]})
享受我更新了问题的解决方法。我最终放弃了acts_as_taggable和meta_search。也许你可以试试塞奇的答案。如果有效,我会将其标记为已回答。:)我刚刚测试了在我的旧项目中这是否有效,它是否有效!因此,我将此标记为已回答。谢谢。:)