2009-05-01 69 views
5

我想让用户能够按照随机顺序翻阅我的博客文章。使用will_paginate通过随机博客文章列表分页

我无法实现这样的:

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

因为:order参数被称为与每个查询,因此我重复的风险博客帖子。

这样做的最好方法是什么?

回答

3

RAND接受MySQL中的种子:)

RAND(,RAND(N)

返回一个随机浮点值 V IN:

RAND(N) 

MySQL docs范围0 < = v < 1.0。如果指定了 恒定整数参数N为 ,则将其用作值 值,该值将生成可重复的 列值序列。在 下面的例子中,请注意由RAND(3)产生的值序列在两个地方都是相同的。

其他数据库应该具有类似的功能。

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

然后,您可以将种子存储在用户的会话中 - 这样每个用户将看到一组对他们唯一的结果。

+0

使用RANDOM()和种子的语法是什么?我找不到它。 – 2009-05-06 03:23:05

0

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

-2

创建上发表你的模型named scope封装的随机行为:

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

PostsController代码就变成了:

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

这是行不通的 - 每次你都会得到一个随机的30个(或者说你的页面大小)。 – 2009-05-02 18:28:33

1

为了避免每个页面(从一个新的请求产生的)可能有一个重复的帖子,你需要存储帖子的顺序在多个请求检索。

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

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