使用will_paginate通过随机列出的博客文章进行分页
-
03-07-2019 - |
题
我希望用户能够以随机顺序浏览我的博文。
我无法像这样实现:
@posts = Post.paginate :page => params[:page], :order => 'RANDOM()'
因为每次查询都会调用:order
参数,因此我冒着重复博客帖子的风险。
最好的方法是什么?
解决方案
RAND接受MySQL的种子:
RAND(N)
来自 MySQL文档:
兰德(),兰德(N)
返回随机浮点值 v在0 <!> lt; = v <!> lt;的范围内; 1.0。如果一个 常数整数参数N是 指定,它用作种子 值,产生可重复的 列值序列。在里面 下面的例子,请注意RAND(3)产生的值序列在它出现的两个地方都是相同的。
其他数据库应该具有类似的功能。
如果您每次调用RAND时都使用 SAME 种子,则订单将在请求之间保持一致,您可以相应地进行分页。
然后,您可以将种子存储在用户的会话中 - 这样每个用户都会看到一组独有的结果。
其他提示
为了避免每个页面(从新请求生成)可能有重复发布的帖子,您需要在某个地方存储帖子的顺序,以便通过多个请求进行检索。
如果您希望每个用户拥有唯一的随机订单,请将订单保存在ID的会话数组中。
如果您不介意所有具有相同随机顺序的用户,则在posts表中有一个位置列。
你可以:order = <!> gt;原始查询上的RANDOM()填充@posts,然后在分页时,不要指定顺序。
在Post模型上创建一个封装随机行为的命名范围: / p>
class Post < ActiveRecord::Base
named_scope :random, :order => 'RANDOM()'
.
.
.
end
然后您的PostsController
代码变为:
@posts = Post.random.paginate :page => params[:page]
不隶属于 StackOverflow