我有一个搜索功能,基本上运行模型记录的有序列表。问题是每当我调用 .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
的有序列表,并且两个列表的排序都是正确的)。但我希望它们是一样的。由于某种原因 limit 改变了这个顺序。有办法让它们保持不变吗?
最佳答案
假设您尝试按第一个元素对该数组的数组进行排序:
[
[ 1, 1 ],
[ 1, 2 ],
[ 1, 3 ]
]
这两个(以及其他几个)都是有效结果,因为您有重复的排序键:
[ [1,1], [1,2], [1,3] ]
[ [1,3], [1,1], [1,2] ]
您在数据库中遇到了同样的问题。你说:
Zarglon and Lirav have the same
pvp_vs
&win_percent
attribute values; afd, sdfa, and Nonad also have the same relationship.
因此,这五个值可以以任何顺序出现,并且仍然满足您指定的 ORDER BY 条件。它们甚至不必在同一查询的两次执行中以相同的顺序从数据库中出来。
如果您想要一致的排序,则需要确保结果集中的每一行都有唯一的排序键,以便一致地打破联系。这是 ActiveRecord,因此您将有一个唯一的 id
可用,以便您可以使用它来打破排序关系:
result = Rom::Leaderboard.order('pvp_vs desc, win_percent desc, id').limit(200)
# --------------------------------------------------------------^^
这将为您提供明确且独特的排序。
关于ruby-on-rails - Rails : Calling . limit(5) 更改结果顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19303998/