我正在试图弄清楚如何制作一个可以返回随机ActiveRecords的范围,同时还支持will_paginate。
现在,每个页面视图都会获得一组完全不同的ActiveRecords随机集。因此,每个分页链接实际上只是另一组随机记录。
我如何设置一个范围,以便它是一个通过分页持续存在的随机顺序?
我猜我需要一些基于时间的种子?
答案 0 :(得分:2)
我猜你在SQL中使用ORDER BY RAND()
来获取随机排序。如果是,那么您可以提供seed for the random number generator:
RAND(), RAND(N)
[...]如果指定了一个常量整数参数 N ,它将用作种子值,从而产生可重复的列值序列。
所以你只需要选择一个种子(甚至可能在你的Ruby代码中使用seed = rand(1e6)
或类似的东西)并在会话中跟踪该种子。然后,对于下一页,将种子拉出会话并将其提供给MySQL的RAND
函数。
请记住,ORDER BY RAND()
(有或没有种子)不是这个星球上最便宜的操作。如果您的可搜索表很小,您可以生成一个包含一堆列的表,用随机数填充(可能由RAND
生成),并将该表连接起来以提供您的随机序列。您可以通过从随机数字表中选择不同的列为不同的查看者提供不同的序列:对于一个用户,您可以按随机数表/矩阵的第11列进行排序,但另一个用户将使用第23列。请记住表(带有主要表) key)实际上只是有限域上的函数(反之亦然),因此您选择的通常只是一个实现细节。使用表格实现RAND
通常会非常繁琐,但我认为无论如何我都会提到这个选项。