思考狮身人面像 - 排序顺序

时间:2013-10-07 07:00:27

标签: ruby-on-rails sphinx thinking-sphinx

我有一个要求,我希望根据我传递给sphinx的ID顺序获得结果:

我使用ruby进行排序和过滤,然后找到user_ids的顺序为

user_ids = [1, 3, 2]

现在,我想在此基础上应用搜索:

User.search_for_ids("Test", {:with => {:page => params[:page], :per_page => 25, :sphinx_internal_id => user_ids}, :sql => {:order => "field(id,#{user_ids.join(',')})"}})

我看到我们可以传递:sql => :当我们需要对sql进行排序时,在选项中排序。但这并没有给我预期排序顺序的结果。

User.where(:id =>  [1, 2, 3]).order("field(id,#{user_ids.join(',')})") 

按预期给出了正确的结果

如果我在这里做错了,请纠正我。有没有办法保留关于user_ids的订单?非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我不相信预定排序顺序有内置机制,但您可以在返回搜索结果后进行排序。显然,如果您使用任何类型的分页,这将无法正常工作:

user_ids = [1,3,2]
results = User.search_for_ids #...
results.sort_by {|result| user_ids.index(result.id) }

答案 1 :(得分:0)

我知道我的修复不是最佳的,但我最终做了类似下面的代码。考虑到“快速”狮身人面像的开销成本似乎并不太高。 Zach的答案很好,但我也需要急切加载几个模型

public class tempSource
{               
    public string systemname { get; set; }
    public string systemdesc { get; set; }
    public string userid { get; set; }
}

public class tempSourceDBContext : DbContext
{
    public DbSet<tempSource> tempSources { get; set; }
}

假设你正在使用will_paginate gem,你应该能够在最后使用papate,因为你将拥有一个arel对象

product_ids = Product.seach_for_ids(term)
products = Product.includes(:manufacturer, :images, :items).where(:id => product_ids).order("field(ID,#{product_ids.join(",")})")