我想让用户能够按照随机顺序翻阅我的博客文章。使用will_paginate通过随机博客文章列表分页
我无法实现这样的:
@posts = Post.paginate :page => params[:page], :order => 'RANDOM()'
因为:order
参数被称为与每个查询,因此我重复的风险博客帖子。
这样做的最好方法是什么?
我想让用户能够按照随机顺序翻阅我的博客文章。使用will_paginate通过随机博客文章列表分页
我无法实现这样的:
@posts = Post.paginate :page => params[:page], :order => 'RANDOM()'
因为:order
参数被称为与每个查询,因此我重复的风险博客帖子。
这样做的最好方法是什么?
RAND接受MySQL中的种子:)
RAND(,RAND(N)
返回一个随机浮点值 V IN:
RAND(N)
从MySQL docs范围0 < = v < 1.0。如果指定了 恒定整数参数N为 ,则将其用作值 值,该值将生成可重复的 列值序列。在 下面的例子中,请注意由RAND(3)产生的值序列在两个地方都是相同的。
其他数据库应该具有类似的功能。
如果您在每次拨打RAND时使用SAME种子,则订单在各个请求之间将保持一致,您可以相应进行分页。
然后,您可以将种子存储在用户的会话中 - 这样每个用户将看到一组对他们唯一的结果。
您可以在您的原始查询中填入@posts,然后在您分页时不指定顺序,您可以:order => RANDOM()。
创建上发表你的模型named scope封装的随机行为:
class Post < ActiveRecord::Base
named_scope :random, :order => 'RANDOM()'
.
.
.
end
你PostsController
代码就变成了:
@posts = Post.random.paginate :page => params[:page]
这是行不通的 - 每次你都会得到一个随机的30个(或者说你的页面大小)。 – 2009-05-02 18:28:33
为了避免每个页面(从一个新的请求产生的)可能有一个重复的帖子,你需要存储帖子的顺序在多个请求检索。
如果您希望每个用户都拥有唯一的随机订单,然后将订单保存在ID会话数组中。
如果您不介意具有相同随机顺序的所有用户,则在posts表中有一个位置列。
使用RANDOM()和种子的语法是什么?我找不到它。 – 2009-05-06 03:23:05