我希望用户能够以随机顺序浏览我的博文。
我无法像这样实现:
@posts = Post.paginate :page => params[:page], :order => 'RANDOM()'
因为每次查询都会调用:order
参数,因此我冒着重复发布博客的风险。
最好的方法是什么?
答案 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]