带分页的随机顺序范围

3

我正在尝试制作一个范围,可以返回随机的ActiveRecords并支持will_paginate。

目前每个页面视图都会得到完全不同的随机ActiveRecords集合。因此,每个分页链接实际上只是另一组随机记录。

我应该如何设置一个范围,使其成为通过分页持续存在的随机顺序?

我猜想我需要有一些基于时间的种子?

1个回答

2
我猜想您在SQL中使用了ORDER BY RAND()来获取随机顺序。如果是这样,您可以为随机数生成器提供一个种子(seed)

RAND(),RAND(N)

[...] 如果指定了一个常量整数参数N,它将用作种子值,产生可重复的列值序列。

因此,您只需要选择一个种子(可能甚至可以在Ruby代码中使用seed = rand(1e6)或类似的内容),并跟踪该种子在会话中。然后,对于下一页,请从会话中取出种子,并将其提供给MySQL的RAND函数。
请记住,ORDER BY RAND()(带有或不带有种子)不是世界上最便宜的操作。如果您要搜索的表很小,则可以生成一个具有许多列的表,填充随机数(可能由RAND生成),并连接该表以提供您要排序的随机序列。通过从随机数表中选择不同的列向不同的查看者提供不同的序列:对于一个用户,您按随机数表/矩阵的第11列进行排序,但是另一个用户将使用第23列。请记住,表(具有主键)实际上只是有限域上的函数(反之亦然),因此选择哪个通常只是实现细节。使用表实现RAND通常会非常麻烦,但无论如何我还是想提一下这个选项。

谢谢,非常有帮助。RAND()函数的价格贵吗?我想让我的活动动态不仅仅是按时间倒序排列。我希望人们能够遇到一些事情。你有什么建议吗? - Cyrus
@Cyrus:按 RAND(x)(对于某些特定的用户x)排序可能是可以的,但请记住如果您开始遇到数据库性能问题,请查看这里。您只需要找到一种将x与每个用户关联起来的方法,将其放入会话或URL中,或者在您特定的情况下使用任何有效的方法即可。 - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接