5

我想让用户能够以随机顺序翻阅我的博客文章。

我不能像这样实现它:

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

由于:order每个查询都会调用该参数,因此我冒着重复博客文章的风险。

最好的方法是什么?

4

4 回答 4

3

RAND 在 MySQL 中接受种子:

RAND(N) 

来自MySQL 文档

兰德(),兰德(N)

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

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

如果您每次调用 RAND 时都使用相同的种子,则请求之间的顺序将是一致的,您可以相应地进行分页。

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

于 2009-05-06T02:13:28.580 回答
1

为了避免每个页面(从新请求生成)可能有重复的帖子,您需要将帖子的顺序存储在某处以便在多个请求中检索。

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

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

于 2009-05-02T07:37:28.100 回答
0

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

于 2009-05-01T15:41:12.737 回答
-2

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

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

然后您的PostsController代码变为:

@posts = Post.random.paginate :page => params[:page]
于 2009-05-01T15:52:26.173 回答