索引显示顺序

时间:2015-04-16 19:32:30

标签: ruby-on-rails ruby ruby-on-rails-4 indexing scaffold

我有一个搜索表单,它以随机顺序返回一个id数组,具体取决于哪个元素在搜索中有更多关键字。在索引中,它们按最小的id排序。

例如:

def search
    ids = [13,8,2,4,7]
    items.where("id in ?", ids)
  end

在我的控制器的索引操作中,我有类似

的内容
@items = Items.search

但是这些项目仍然以索引表中的[2,4,7,8,13]等顺序显示。

如何以相同的顺序显示我在搜索功能中查询的项目?

2 个答案:

答案 0 :(得分:5)

要根据现有索引进行排序,您需要执行以下操作:

ids = [13,8,2,4,7]
id_positions = Hash[ids.each_with_index.to_a]

items.where(id: ids).sort_by do |r|
  id_positions[r.id]
end

使用映射表将它们恢复为原始顺序。

请注意,这与延迟迭代不兼容,它们都需要被拉入以进行操作。但是,它应该与您处理结果子集的分页一起使用。

sort_by调用可以在任何Array类型集上完成,因此即使搜索结果也可以。

答案 1 :(得分:4)

与tadman的答案相比,有一个更短的方法来完成相同的结果。

ids = [13,8,2,4,7]
items = Item.find(ids) #or whatever your search criteria includes...
items.index_by(&:id).values_at(*ids) #returns in ids order from above...