Rails:调用.limit(5)改变结果的顺序

时间:2013-10-10 18:56:06

标签: 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_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的有序列表,并且两个列表都是正确排序的)。但我希望它们是一样的。由于某种原因限制更改此顺序。反正他们一样吗?

1 个答案:

答案 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) 
# --------------------------------------------------------------^^

这将为您提供定义明确且独特的订单。