我正在构建一个应用程序,我想使用简单搜索在一次搜索中搜索对象的标题和AND标记(使用acts_as_taggable_on)
我能够构建其中之一,但不能同时构建两者,而且我最终会想到这一点。
要使用标签进行搜索,我使用:
@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
知道如何组合这两个查询吗?到目前为止的任何尝试都没有成功,主要是因为我的Post模型中没有“标签”列等。
答案 0 :(得分:2)
我想出来并在我的解决方案中测试它,我自己写了连接,所以它不像我想的那么干净,所以如果有人有更好的解决方案,我仍然喜欢看到它。这就是我想出的:
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 )
这在我的测试中按预期工作。我正在测试三个记录。一个在标题中有搜索词,另一个只有标签,第三个有标题和标签,所以它不应该返回重复。
希望这有帮助。
答案 1 :(得分:1)
我发现了这个: Search form with acts_as_taggable_on (Rails 3)
这可能有用,但我也用kaminari gem分配我的结果所以当我使用这种方法时,我得到以下错误:
undefined method `page' for []:Array
所以这在我的情况下不起作用。我很乐意找到一个单一查询的解决方案来处理整个问题。
答案 2 :(得分:0)
作为安德鲁代码的后续内容,我在我的模型中使用了这种搜索方法 - 只是添加了不区分大小写的内容并且发布了帖子" 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