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

我无法像这样实现:

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

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

最好的方法是什么?

有帮助吗?

解决方案

RAND接受MySQL的种子:

RAND(N) 

来自 MySQL文档

  

兰德(),兰德(N)

     

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

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

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

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

其他提示

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

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

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

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

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

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

然后您的PostsController代码变为:

@posts = Post.random.paginate :page => params[:page]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top