在博客文章的最后,我想显示另一篇随机帖子的预告片链接。显然,这个链接不应该是当前帖子本身的预告片。
我已经知道如何选择随机帖子,但是预告片链接仍然是指向当前帖子的链接。我无法弄清楚,我怎么能排除这种情况。
这是我的控制器:
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。
答案 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
。
我想这应该有效!