Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 使用属性进行简单搜索,并充当标记_Ruby On Rails 3_Full Text Search_Acts As Taggable On - Fatal编程技术网

Ruby on rails 3 使用属性进行简单搜索,并充当标记

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

我正在构建一个应用程序,我想使用一个简单的搜索在一次搜索中搜索对象的标题和标签(使用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
知道如何组合这两个查询吗?到目前为止,任何尝试都没有成功,主要是因为我的帖子模型中没有“标签”栏等。

我发现:

这可能会起作用,但我也在使用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)