我有一个搜索表单,它以随机顺序返回一个id数组,具体取决于哪个元素在搜索中有更多关键字。在索引中,它们按最小的id排序。
例如:
def search
ids = [13,8,2,4,7]
items.where("id in ?", ids)
end
在我的控制器的索引操作中,我有类似
的内容@items = Items.search
但是这些项目仍然以索引表中的[2,4,7,8,13]
等顺序显示。
如何以相同的顺序显示我在搜索功能中查询的项目?
答案 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...