【发布时间】:2016-09-30 04:24:37
【问题描述】:
我有一个包含实验室模型的数据库。我希望能够使用多种不同的方法来搜索它们。
-
我选择使用一个输入字段并将查询分成单词数组:
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}%"} -
Sunspot 似乎也是进行全文搜索的好方法
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? (SO说没有办法)
【问题讨论】:
-
您也可以在结果数组上只使用 Enumerable 的
select和sort或sort_by -
@diego.greyrobot 太慢了 :) OP 想要将其转换为 AR 是完全正确的
-
tag_result或其他结果到底是什么? -
能否提供每个查询的sql?
-
B 七 - tag_results 只是一个数组。 .tagged_with 是 Acts-as-taggable gem 提供的方法。
标签: mysql ruby-on-rails ruby activerecord