Rails - 显示随机记录但不是当前记录

时间:2014-02-17 18:45:55

标签: ruby-on-rails ruby-on-rails-3.2 random-access

在博客文章的最后,我想显示另一篇随机帖子的预告片链接。显然,这个链接不应该是当前帖子本身的预告片。

我已经知道如何选择随机帖子,但是预告片链接仍然是指向当前帖子的链接。我无法弄清楚,我怎么能排除这种情况。

这是我的控制器:

def show
    @post = Post.find(params[:id])
    @staff_pickrandom = Post.where(staff_pick:true).order("RANDOM()").limit(1)
end

我对Rails很陌生,我仍然在努力解决基本问题。 对不起,如果这很容易。非常感谢你帮忙!!!

更新: 我使用的是Rails 3.2和"friendly_id" Gem

4 个答案:

答案 0 :(得分:4)

使用order('RANDOM()').limit(1)是正确的开始方式,因为让数据库选择随机记录比获取大量ID更好,并让Ruby从数组中采样更好。为避免选择您当前正在使用的帖子where.not以排除该帖子

 Post.where(staff_pick: true).where.not(id: @post.id).order('RANDOM()').limit(1)

 Post.where(staff_pick: true).where('id != ?', @post.id).order('RANDOM()').limit(1)

答案 1 :(得分:0)

def show
    @post = Post.find(params[:id]) # [1]
    ids = Post.ids # [1, 2, 3, 4, 5]
    ids.shuffle # [3, 5, 2, 1, 4]
    ids.delete(params[:id]) # [3, 5, 2, 4]
    @staff_pickrandom = Post.find(ids[0]) # [3]
end

有很多方法可以做到这一点。最好创建一个帮助器。

答案 2 :(得分:0)

这取决于你想要的大小。最简单的是:

@staff_pickrandom = Post.where(staff_pick:true).sample

这将从Post.where(staff_pick:true)返回的数组中选择一个随机对象。如果您发现记录太多,则可以在where子句中添加更多内容

答案 3 :(得分:0)

尝试:

@post = Post.where(staff_pick: true).where.not(id: params[:id]).shuffle.first

如果无法像在Rails 4中那样where.not,请尝试:

Post.where(staff_pick: true).where("id != ?", params[:id]).shuffle.first

编辑:因为您正在使用friendly_id gem,所以不应该将slug(params [:id])与数据库中记录的id进行比较。 首先声明您要查找的帖子,例如@post = Post.find(params[:id]),并从上面的查询中删除params [:id],然后使用@post.id

我想这应该有效!