【发布时间】:2013-10-10 18:56:06
【问题描述】:
我有一个搜索功能,它基本上运行模型记录的有序列表。问题是每当我调用.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 的有序列表,并且两个列表都正确排序)。但我希望它们是一样的。由于某种原因,限制改变了这个顺序。有没有办法让它们保持不变?
【问题讨论】:
-
请从日志中为每个变体发布相应的 SQL 查询。
-
仅供参考,您的代码可以重写为更加更简洁、更惯用:codepad.org/TnzCtgMA
-
@meagar 是的,如果您将限制作为选项,默认为 200,它将立即解决 OP 的问题。
-
您需要了解一般的数据库。基本上,如果您要求对某些列进行排序,则只能保证获得按这些列排序的行。当有序列的值匹配时,您应该预期随机性。你只会得到你所要求的。如果您有其他订购标准,则还需要包括这些标准。像“给我你以前给我的命令”这样的无定形标准不是你可以要求数据库的。
标签: ruby-on-rails ruby-on-rails-3 postgresql activerecord rails-activerecord