ruby-on-rails - Rails : Calling . limit(5) 更改结果顺序

标签 ruby-on-rails ruby-on-rails-3 postgresql activerecord rails-activerecord

我有一个搜索功能,基本上运行模型记录的有序列表。问题是每当我调用 .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_vswin_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/

相关文章:

ruby-on-rails - 无法在生产中 bundle

macos - 如何将 SQL 查询作为包含双引号的参数传递给 psql

ruby-on-rails - 如何升级项目的 Ruby 版本?

ruby-on-rails - 为Rails模型创建Elasticsearch索引时如何修复 “Illegal Argument Exception”?

ruby-on-rails - 仅针对某些操作的自定义路由路径

mysql - 如何使用表中不同数量的列来设计数据库

java - 运行 mvn clean install 应用程序尝试将 postgres 连接到错误的端口

ruby-on-rails - 我应该在删除操作 : user. delete 或 user.destroy 中使用哪个?

ruby-on-rails - 从 Rails 3 Controller 抽象资源名称

ruby-on-rails - 传递参数到表单