【问题标题】:Rails advanced search queryRails 高级搜索查询
【发布时间】:2016-09-30 04:24:37
【问题描述】:

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

  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. Sunspot 似乎也是进行全文搜索的好方法

    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
    

它工作得很好(我的意思是结果是我所期望的)但它返回一个简单的数组而不是ActiveRecord::Relation 所以我无法使用.select().order() 这样的方法结果。

我想问有没有更好的方法来实现这样的搜索?我正在搜索搜索引擎,但似乎没有什么适合我的想法。

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

【问题讨论】:

  • 您也可以在结果数组上只使用 Enumerable 的 selectsortsort_by
  • @diego.greyrobot 太慢了 :) OP 想要将其转换为 AR 是完全正确的
  • tag_result 或其他结果到底是什么?
  • 能否提供每个查询的sql?
  • B 七 - tag_results 只是一个数组。 .tagged_with 是 Acts-as-taggable gem 提供的方法。

标签: mysql ruby-on-rails ruby activerecord


【解决方案1】:

回答这个问题:

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

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

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

这是我知道的唯一方法。

【讨论】:

  • 没错。答案在 SO 线程中,我只检查了下面的一个鼠标滚动 :) 谢谢你提出这个问题。你能评论一下我用来执行搜索的方式吗?有什么我应该知道的可以帮助我简化这一点的宝石吗?
  • @Ancinek 我可以看到你是黑子,我从未使用过(我只使用过 elasticsearch),因此无法提供任何有价值的输入。我说如果可以的话,以某种方式测量它。只要它是资源高效的并且不慢 - 就可以了..
猜你喜欢
  • 2014-06-08
  • 2012-02-08
  • 2015-03-02
  • 2018-10-21
  • 2015-06-09
  • 2018-11-05
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多