我有一个实验室模型的数据库。我希望能够使用多种不同的方法搜索它们。
我选择使用一个输入字段并将单独的查询分隔为单词数组:
search = search.split(/[^[[:word:]]]+/).map{|val| val.downcase}
我使用Acts-as-taggable gem,所以最好将这些标签包含在搜索中:
tag_results = self.tagged_with(search, any: true, wild: true)
对于下面的方法,似乎有必要使用:
search = search.map{|val| "%#{val}%"}
太阳黑子似乎也是进行全文搜索的好方法,所以
full_text_search = self.search {fulltext search}
full_text_results = full_text_search.results
我决定使用简单的数据库查询搜索实验室名称:
name_results = self.where("LOWER(name) ILIKE ANY ( array[?] )", search)
最后,我需要在一个数组中得到所有结果:
result = (tag_results + name_results + full_text_results).uniq
它完美地工作(我的意思是结果是我所期望的)但它返回一个简单的数组而不是ActiveRecord::Relation
所以我无法使用像.select()
或{这样的方法{1}}结果。
我想问一下,有没有更好的方法来实现这样的搜索?我正在寻找搜索引擎,但似乎没有任何东西适合我的想法。
如果没有 - 有没有办法将数组转换为ActiveRecord :: Relation? (所以说没有办法)
答案 0 :(得分:2)
回答这个:
有没有办法将数组转换为ActiveRecord :: Relation? (所以 说没有办法)
您可以通过从数组中获取ID并将AR模型查询具有这些ID的对象,将数组ob ActiveRecord对象转换为ActiveRecord :: Relation:
Model.where(id: result.map(&:ids)) # returns AR, as expected.
这是我所知道的唯一方式。