我有一个搜索功能,它基本上运行一个有序的模型记录列表。问题是每当我拨打.search.limit(5)
时,结果与我致电.search
时的顺序不同
以下是我的一些方法
def self.search(server_name, pvp_type)
if server_name.nil?
result = Rom::Leaderboard.order('pvp_vs desc, win_percent desc').limit(200)
end
end
当我打电话
Rom::Leaderboard.search(nil, 2).pluck(:actor_name)
SQL翻译:
SELECT "rom_leaderboards"."actor_name" FROM "rom_leaderboards" WHERE "rom_leaderboards"."pvp_type" = 2 ORDER BY pvp_vs desc, win_percent desc LIMIT 200
我得到以下结果:
[Zarglon, Lirav, adf, sdfa, Nonad, ...]
Zarglon和Lirav拥有相同的pvp_vs
& win_percent
个属性值; afd,sdfa和Nonad也有同样的关系。
现在我打电话
Rom::Leaderboard.search(nil, 2).limit(5).pluck(:actor_name)
SQL翻译:
SELECT "rom_leaderboards"."actor_name" FROM "rom_leaderboards" WHERE "rom_leaderboards"."pvp_type" = 2 ORDER BY pvp_vs desc, win_percent desc LIMIT 5
我得到以下结果:
[Lirav, Zarglon, sfda, Nonad, adf]
这些查询都是正确的(因为搜索返回基于pvp_vs & win_percent
的有序列表,并且两个列表都是正确排序的)。但我希望它们是一样的。由于某种原因限制更改此顺序。反正他们一样吗?
答案 0 :(得分:4)
假设您尝试通过第一个元素对此数组数组进行排序:
[
[ 1, 1 ],
[ 1, 2 ],
[ 1, 3 ]
]
这两个(以及其他几个)都是有效的结果,因为您有重复的排序键:
[ [1,1], [1,2], [1,3] ]
[ [1,3], [1,1], [1,2] ]
您在数据库中遇到同样的问题。你这么说:
Zarglon和Lirav拥有相同的
pvp_vs
&win_percent
个属性值; afd,sdfa和Nonad也有同样的关系。
因此,这五个值可以按任何顺序出现,并且仍然满足您指定的ORDER BY条件。在同一个查询的两次执行中,它们甚至不必以相同的顺序从数据库中出来。
如果您想要一致的排序,您需要确保结果集中的每一行都有一个唯一的排序键,以便一致地打破关系。这是ActiveRecord,因此您将拥有一个独特的id
,以便您可以使用它来打破订购关系:
result = Rom::Leaderboard.order('pvp_vs desc, win_percent desc, id').limit(200)
# --------------------------------------------------------------^^
这将为您提供定义明确且独特的订单。