Rails随机活动记录与分页

我需要查找特定资源的所有记录并以随机顺序显示它们,但是具有一致的分页(如果开始分页,则不会看到相同的记录两次)。 每次用户访问页面时,显示顺序应随机化。 我正在使用will_paginate 。 任何建议?

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

获取一个大的随机数:

cookies[:seed] = SecureRandom.random_number.to_s[2..20].to_i 

使用例如MySQL的种子:

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

据我所知,这不是标准。 我可以看到这样的用途,例如在线测试。

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

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

希望这可以帮助。

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

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

查看一些有关性能问题的评论: https : //rails.lighthouseapp.com/projects/8994/tickets/1274-patch-add-support-for-order-random-in-queries

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

我最终得到了这个适用于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])