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

时间:2009-05-01 05:10:20

标签: ruby-on-rails random will-paginate

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

我无法像这样实现:

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

因为每次查询都会调用:order参数,因此我冒着重复发布博客的风险。

最好的方法是什么?

4 个答案:

答案 0 :(得分:3)

RAND接受MySQL的种子:

RAND(N) 

来自MySQL docs

  

兰德(),兰德(N)

     

返回随机浮点值   v在0 <= v <0的范围内。 1.0。如果一个   常数整数参数N是   指定,它用作种子   值,产生可重复的   列值序列。在里面   下面的例子,请注意RAND(3)产生的值序列在它出现的两个地方都是相同的。

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

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:-2)

在Post模型上创建一个封装随机行为的named scope

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

您的PostsController代码将变为:

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