我有一个带有Lab模型的数据库。我希望能够使用多种不同的方法来搜索它们。
我选择使用一个输入字段并将查询分为单词数组:
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()
或.order()
对结果。
我想问一下,有没有更好的方法来实现这种搜索?我在搜索搜索引擎,但似乎没有什么适合我的想法。
如果没有-有没有办法将数组转换为ActiveRecord :: Relation?(所以说没有办法)
回答这个:
有没有一种方法可以将数组转换为ActiveRecord :: Relation?(所以说没有办法)
您可以通过从数组中获取ID并向您的AR模型查询具有以下ID的对象,从而将数组从ActiveRecord对象转换为ActiveRecord :: Relation。
Model.where(id: result.map(&:ids)) # returns AR, as expected.
这是我所知道的唯一方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句