Rails高级搜索查询

时间:2016-09-29 20:14:19

标签: mysql ruby-on-rails ruby activerecord

我有一个实验室模型的数据库。我希望能够使用多种不同的方法搜索它们。

  1. 我选择使用一个输入字段并将单独的查询分隔为单词数组:

    search = search.split(/[^[[:word:]]]+/).map{|val| val.downcase}
    
  2. 我使用Acts-as-taggable gem,所以最好将这些标签包含在搜索中:

    tag_results =  self.tagged_with(search, any: true, wild: true)
    
  3. 对于下面的方法,似乎有必要使用:

    search = search.map{|val| "%#{val}%"}
    
  4. 太阳黑子似乎也是进行全文搜索的好方法,所以

    full_text_search = self.search {fulltext search}
    full_text_results = full_text_search.results
    
  5. 我决定使用简单的数据库查询搜索实验室名称:

    name_results = self.where("LOWER(name) ILIKE ANY ( array[?] )", search)
    
  6. 最后,我需要在一个数组中得到所有结果:

    result = (tag_results + name_results + full_text_results).uniq
    
  7. 它完美地工作(我的意思是结果是我所期望的)但它返回一个简单的数组而不是ActiveRecord::Relation所以我无法使用像.select()或{这样的方法{1}}结果。

    我想问一下,有没有更好的方法来实现这样的搜索?我正在寻找搜索引擎,但似乎没有任何东西适合我的想法。

    如果没有 - 有没有办法将数组转换为ActiveRecord :: Relation? (所以说没有办法)

1 个答案:

答案 0 :(得分:2)

回答这个:

  

有没有办法将数组转换为ActiveRecord :: Relation? (所以   说没有办法)

您可以通过从数组中获取ID并将AR模型查询具有这些ID的对象,将数组ob ActiveRecord对象转换为ActiveRecord :: Relation:

Model.where(id: result.map(&:ids)) # returns AR, as expected.

这是我所知道的唯一方式。