索引显示顺序

Index display order

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

例如:

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

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

@items = Items.search

但项目在索引 table 中一直按 [2,4,7,8,13] 的顺序显示。

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

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

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

这 returns 他们使用映射 table.

到他们原来的顺序

请注意,这与惰性迭代不兼容,它们都需要拉入才能进行操作。不过,它应该与您处理结果子集的分页一起使用。

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

实现与塔德曼的回答相同的结果的方法有点短。

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...