使用will_paginate通过随机列出的博客文章进行分页

我希望用户能够以随机顺序浏览我的博客post。

我无法像这样实现它:

@posts = Post.paginate :page => params[:page], :order => 'RANDOM()' 

因为:order参数是在每个查询中调用的,因此我冒着重复博客post的风险。

最好的方法是什么?

兰德接受MySQL的种子:

 RAND(N) 

来自MySQL文档 :

兰德(),兰德(N)

返回0 <= v <1.0范围内的随机浮点值v。 如果指定了常量整数参数N,则将其用作种子值,从而生成可重复的列值序列。 在下面的示例中,请注意RAND(3)生成的值序列在它出现的两个位置都是相同的。

其他数据库应具有类似的function。

如果您每次调用RAND时都使用SAME种子,则订单将在请求之间保持一致,您可以相应地进行分页。

然后,您可以将种子存储在用户的会话中 – 这样每个用户都将看到一组独有的结果。

为了避免每个页面(从新请求生成)可能有重复的post,您需要在某个地方存储post的顺序,以便通过多个请求进行检索。

如果您希望每个用户都有一个唯一的随机订单,请将订单保存在ID的会话数组中。

如果您不介意具有相同随机顺序的所有用户,则在posts表中有一个位置列。

您可以:在原始查询上填写@posts的order => RANDOM(),然后在分页时,不要指定顺序。

在Post模型上创建一个封装随机行为的命名范围 :

 class Post < ActiveRecord::Base named_scope :random, :order => 'RANDOM()' . . . end 

你的PostsController代码然后变成:

 @posts = Post.random.paginate :page => params[:page]