我想让用户能够以随机顺序翻阅我的博客文章。
我不能像这样实现它:
@posts = Post.paginate :page => params[:page], :order => 'RANDOM()'
由于:order
每个查询都会调用该参数,因此我冒着重复博客文章的风险。
最好的方法是什么?
我想让用户能够以随机顺序翻阅我的博客文章。
我不能像这样实现它:
@posts = Post.paginate :page => params[:page], :order => 'RANDOM()'
由于:order
每个查询都会调用该参数,因此我冒着重复博客文章的风险。
最好的方法是什么?
RAND 在 MySQL 中接受种子:
RAND(N)
来自MySQL 文档:
兰德(),兰德(N)
返回 0 <= v < 1.0 范围内的随机浮点值 v。如果指定了常量整数参数 N,则将其用作种子值,从而生成可重复的列值序列。在下面的示例中,请注意 RAND(3) 产生的值序列在它出现的两个地方都是相同的。
其他数据库应该具有类似的功能。
如果您每次调用 RAND 时都使用相同的种子,则请求之间的顺序将是一致的,您可以相应地进行分页。
然后,您可以将种子存储在用户的会话中 - 这样每个用户都会看到一组他们独有的结果。
为了避免每个页面(从新请求生成)可能有重复的帖子,您需要将帖子的顺序存储在某处以便在多个请求中检索。
如果您希望每个用户都有一个唯一的随机顺序,则将该顺序保存在 ID 的会话数组中。
如果您不介意所有用户都具有相同的随机顺序,那么在帖子表中有一个位置列。
您可以在填充@posts 的原始查询上使用 :order => RANDOM() ,然后在分页时不要指定顺序。
在封装随机行为的 Post 模型上创建一个命名范围:
class Post < ActiveRecord::Base
named_scope :random, :order => 'RANDOM()'
.
.
.
end
然后您的PostsController
代码变为:
@posts = Post.random.paginate :page => params[:page]