Ruby on rails 3 使用属性进行简单搜索,并充当标记
我正在构建一个应用程序,我想使用一个简单的搜索在一次搜索中搜索对象的标题和标签(使用acts_as_taggable_on) 我可以构建其中一个,但不能同时构建这两个,并且我绞尽脑汁想弄明白它 要使用标记进行搜索,我使用:Ruby on rails 3 使用属性进行简单搜索,并充当标记,ruby-on-rails-3,full-text-search,acts-as-taggable-on,Ruby On Rails 3,Full Text Search,Acts As Taggable On,我正在构建一个应用程序,我想使用一个简单的搜索在一次搜索中搜索对象的标题和标签(使用acts_as_taggable_on) 我可以构建其中一个,但不能同时构建这两个,并且我绞尽脑汁想弄明白它 要使用标记进行搜索,我使用: @post = Post.tagged_with(params[:search]) 要搜索对象,我使用: @post = Post.search(params[:search]) 我在Post模型中编写了一个名为search的方法,如下所示: def self.searc
@post = Post.tagged_with(params[:search])
要搜索对象,我使用:
@post = Post.search(params[:search])
我在Post模型中编写了一个名为search的方法,如下所示:
def self.search(search)
if search
where('question LIKE ?', "%#{search}%")
else
scoped
end
end
知道如何组合这两个查询吗?到目前为止,任何尝试都没有成功,主要是因为我的帖子模型中没有“标签”栏等。我发现:
这可能会起作用,但我也在使用kaminari gem分页我的结果,因此当我使用这种方法时,我会得到以下错误:
undefined method `page' for []:Array
所以这在我的情况下是行不通的。我很想找到一个只需一个查询就可以处理整个问题的解决方案。我找到了解决方案,并在我的解决方案中进行了测试,我自己编写了连接,因此它不像我希望的那样干净。因此,如果有人有更好的解决方案,我仍然希望看到它。以下是我的想法:
q = "%#{search}%"
Post.select('distinct posts.*').joins("LEFT JOIN taggings on posts.id = taggings.taggable_id")
.joins("LEFT JOIN tags on tags.id = taggings.tag_id")
.where('title LIKE ? OR tags.name LIKE ?', q, q )
在我的测试中,这是正常的。我正在测试三个记录。一个在标题中有搜索词,另一个只有标签,第三个同时有标题和标签,所以它不应该返回重复项
希望这能有所帮助。作为Andrew代码的后续,我在模型中使用了这种搜索方法——只是增加了大小写不敏感,并使post“title”查询更加明确,因为我的模型实际上包含了一个模棱两可的“name”属性
def self.search(search)
if search.present?
q = "%#{search}%"
Post.select('distinct posts.*').joins("LEFT JOIN taggings on posts.id = taggings.taggable_id")
.joins("LEFT JOIN tags on tags.id = taggings.tag_id")
.where('lower(posts.title) LIKE lower(?) OR lower(tags.name) LIKE lower(?)', q, q )
else
all
end
end
我在找同样的东西,却没有运气。您在这方面有什么好运气吗?我已经更新了代码以包含select方法,以便将distinct添加到查询中。我最初的测试不够全面,我只是发现在某些情况下会返回重复的结果。在这一点上,这几乎就像编写原始SQL代码,但这是我在这一点上能想到的最好的方法。虽然我还没有测试过,但希望这能让你走上正确的轨道:啤酒=啤酒。包括(:啤酒厂,:风格)。top(100)beers=Kaminari.paginate_数组(啤酒)。page(参数[:page])。per(25)