2014-09-30 127 views
0

使用RoR 3.9,我搜索的是搜索逗号分隔的关键字;例如“apple,orange”会找到任何有“apple”或“orange”这个词的记录。我希望能够对结果进行排序,以便首先显示包含两个单词的任何记录。例如通过多种因素对搜索结果进行排序

一种“苹果,橙”将记录之前显示记录

“橙片和苹果馅饼”

“苹果汁”

即使搜索苹果汁首先被发现。如何在按字母数字顺序排序之前添加此第一级排序?我想我可以在控制器索引操作中通过设置索引搜索的顺序首先显示任何具有“苹果”和“橙色”的记录,然后显示所有其他具有“苹果”或“橙色”的记录, ,我只是不知道该怎么做。

这里是搜索一组逗号分隔值范围:

scope :by_description, ->(desc=nil) { 
    if desc.blank? 
     all 
    else 
     terms = desc.split(/\s*,\s*/).map { |t| t.strip }.map { |t| "%#{t}%" } 
     where((["#{table_name}.description like ?"] * terms.count).join(' or '), *terms) 
    end 
    } 

我打电话范围在我的控制器像这样:

def index 

@drawings = Drawing.by_description(params[:drawings][:description]).all 
... 
+0

这是您需要的相当多的搜索逻辑。您是否考虑通过'sunspot' gem启动全文搜索服务器,如Apache Solr?有关于它的Railscast。 – 2014-09-30 20:09:36

回答

0

你可以排序使用和拉姆达比较结果:

description = params[:drawings][:description].to_s 
@drawings.sort_by { |d| d.description.index(description) } 

这会找到子字符串在descr中的位置iption。最低的索引将意味着子串在描述中最早出现。

相关问题