【问题标题】:Rails: Calling .limit(5) changes order of resultsRails:调用 .limit(5) 更改结果的顺序
【发布时间】: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


【解决方案1】:

假设您尝试按第一个元素对该数组进行排序:

[
  [ 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) 
# --------------------------------------------------------------^^

这将为您提供定义明确且独特的排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多