Ruby on rails 带有分页的Rails随机活动记录

Ruby on rails 带有分页的Rails随机活动记录,ruby-on-rails,Ruby On Rails,我需要找到特定资源的所有记录,并以随机顺序显示它们,但要使用一致的分页(如果开始分页,您将不会看到同一条记录两次)。每次用户访问页面时,显示顺序都应随机化。我正在使用。有什么建议吗?如果您使用的数据库(如MySQL)具有随机功能(如RAND()),您可以将其添加到分页查询中,如下所示: Resource.paginate( ... :order => "RAND()" ... ) 查看此处有关性能问题的一些评论:据我所知,这不是标准。我可以看到它在在线测试中的应用 我建议使用每个会话/用

我需要找到特定资源的所有记录,并以随机顺序显示它们,但要使用一致的分页(如果开始分页,您将不会看到同一条记录两次)。每次用户访问页面时,显示顺序都应随机化。我正在使用。有什么建议吗?

如果您使用的数据库(如MySQL)具有随机功能(如
RAND()
),您可以将其添加到分页查询中,如下所示:

Resource.paginate( ... :order => "RAND()" ... )

查看此处有关性能问题的一些评论:

据我所知,这不是标准。我可以看到它在在线测试中的应用

我建议使用每个会话/用户的列表。因此,当用户第一次进入该页面时,您将确定一个ID列表(以随机顺序)以及所有连续视图,您将使用该列表显示该用户/会话的正确顺序

我希望行的数量是有限的,然后这将是有意义的,例如对于测试。此外,当用户在完成测试之前离开测试时,她可以继续他离开的地方。但这可能与你无关


希望这有帮助。

不确定您是否还需要帮助。我过去做过的一个解决方案是使用RAND进行查询,但首先不分页。然后存储这些记录ID,并使用存储的列表从那里进行查找和分页。初始RAND查询可以设置为仅在页面为1或nil时运行。想一想。

在用户会话cookie中存储一个随机数,然后将其用作数据库随机函数的种子。在用户关闭浏览器之前,这将是相同的,因此他们都将看到随机的、一致的记录:

获取一个大的随机数:

cookies[:seed] = SecureRandom.random_number.to_s[2..20].to_i
将此种子与MySQL一起使用:

SomeModel.all.order("RAND ?", cookies[:seed])

我最终得到了一个在Postgres上对我有用的解决方案:

session[:seed] ||= rand() # should be between [-1..1]
seed = session[:seed] 
Product.select("setseed(#{seed})").first
Product.order('random()').limit(10).offset(params[:offset])

这行不通。当更改页面(即1到2)时,将再次运行查询,并且可能会出现重复条目(第1页上的条目也会出现在第2页上)。我以为您的意思是希望每个页面上的条目都是随机的。您可以将以前查看过的页面存储在会话数组中,并在下一次请求时将其过滤掉,但这似乎非常粗糙和脆弱。是的,这似乎不是一个很好的解决方案。我只是有点惊讶没有更好的东西存在。我以前在RubyonRails应用程序中见过它的实现,比如。我查看了Sortfolio,它们的列表不是随机的。如果刷新页面几次,您将看到相同顺序的列表,只是从不同的偏移量开始。这几乎就像绕一圈,你可以从任何一点开始,但如果你沿着同一个方向绕,你总是会以一致的顺序经过相同的点。谢谢你的留言。我不知道这个网站没有使用随机。谢谢你的想法。我已经很久没有看这个了,也不记得它在哪里用过了!更新:我刚刚意识到一件事:你可能应该让随机种子成为你URL的一部分,这样当用户存储书签或保存URL时,它就不会破坏分页。然后可以执行seed | |=params[:seed]| | seed