索引显示顺序
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...
我有一个搜索表单,其中 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...