我正在尝试制作一个范围,可以返回随机的ActiveRecords并支持will_paginate。
目前每个页面视图都会得到完全不同的随机ActiveRecords集合。因此,每个分页链接实际上只是另一组随机记录。
我应该如何设置一个范围,使其成为通过分页持续存在的随机顺序?
我猜想我需要有一些基于时间的种子?
我正在尝试制作一个范围,可以返回随机的ActiveRecords并支持will_paginate。
目前每个页面视图都会得到完全不同的随机ActiveRecords集合。因此,每个分页链接实际上只是另一组随机记录。
我应该如何设置一个范围,使其成为通过分页持续存在的随机顺序?
我猜想我需要有一些基于时间的种子?
ORDER BY RAND()
来获取随机顺序。如果是这样,您可以为随机数生成器提供一个种子(seed):
因此,您只需要选择一个种子(可能甚至可以在Ruby代码中使用
RAND(),RAND(N)
[...] 如果指定了一个常量整数参数N,它将用作种子值,产生可重复的列值序列。
seed = rand(1e6)
或类似的内容),并跟踪该种子在会话中。然后,对于下一页,请从会话中取出种子,并将其提供给MySQL的RAND
函数。ORDER BY RAND()
(带有或不带有种子)不是世界上最便宜的操作。如果您要搜索的表很小,则可以生成一个具有许多列的表,填充随机数(可能由RAND
生成),并连接该表以提供您要排序的随机序列。通过从随机数表中选择不同的列向不同的查看者提供不同的序列:对于一个用户,您按随机数表/矩阵的第11列进行排序,但是另一个用户将使用第23列。请记住,表(具有主键)实际上只是有限域上的函数(反之亦然),因此选择哪个通常只是实现细节。使用表实现RAND
通常会非常麻烦,但无论如何我还是想提一下这个选项。
RAND(x)
(对于某些特定的用户x
)排序可能是可以的,但请记住如果您开始遇到数据库性能问题,请查看这里。您只需要找到一种将x
与每个用户关联起来的方法,将其放入会话或URL中,或者在您特定的情况下使用任何有效的方法即可。 - mu is too short