我想对随机排序的ActiveRecord模型( MySQL数据库中的行)列表进行分页。
但是,这种随机化需要在每个会话的基础上持续存在,以便访问该网站的其他人也会收到随机的、可分页的记录列表。
假设有足够多的实体(数万个)在会话或cookie中存储随机排序的ID值太大,所以我必须用其他方式(MySQL、文件等)暂时持久化它。
最初,我认为可以根据会话ID和页面ID创建一个函数(返回该页面的对象ID ),然而,由于MySQL中的对象ID值不是连续的(有间隙),当我查看它时,它似乎就崩溃了。优点是它不需要/最少的存储空间,但缺点是它的实现可能相当复杂,可能会占用大量的CPU。
我的感觉是我应该创建一个交叉表,类似于:
random_sorts( sort_id, created_at, user_id NULL if guest)
random_sort_items( sort_id, item_id, position )然后简单地将“sort_id”存储在会话中。然后,我可以对random_sorts进行分页,其中sort_id =n ORDER BY position LIMIT...像往常一样。
当然,在一段时间不活动(基于random_sorts.created_at)后,我必须在其中放置某种类型的收割器来移除它们。
不幸的是,我不得不在创建新对象(和/或删除旧对象,尽管很少删除)时使排序无效。而且,随着负载的增加,这个表的大小/性能(即使是正确索引的表)也会下降。
这看起来应该是一个可以解决的问题,但是我找不到任何能做到这一点的rails插件。有什么想法吗?谢谢!!
发布于 2010-03-09 06:47:33
MySQL有一个可以在您的ORDER子句中使用的RAND函数,它传递一个绑定到用户会话的种子。
按RAND排序(?)
在哪里?是会话中的种子值。这将为您提供跨请求的可重复排序。
发布于 2010-03-09 06:06:22
我可能漏掉了一些东西,但像这样的东西
select ... order by sha1(concat($session_id,item_id)) limit m,n;
努力为你提供一个随机排序的,可重复的每个会话的分页列表?在索引使用上不是很好,但您可以避免任何预填充/ tmp表/无效。
发布于 2010-03-09 06:10:55
就我个人而言,为了节省存储空间和理智,我只使用一个使用user_id的随机种子。
srand user_id
items.sort_by{ rand }https://stackoverflow.com/questions/2405077
复制相似问题