使用属性AND acts_as_taggable进行简单搜索

时间:2012-02-12 11:14:13

标签: ruby-on-rails-3 full-text-search acts-as-taggable-on

我正在构建一个应用程序,我想使用简单搜索在一次搜索中搜索对象的标题和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模型中没有“标签”列等。

3 个答案:

答案 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