Rails - 显示随机记录但不显示当前记录
Posted
技术标签:
【中文标题】Rails - 显示随机记录但不显示当前记录【英文标题】:Rails - Show A Random Record But Not The Current 【发布时间】:2014-02-17 18:45:54 【问题描述】:在一篇博文的末尾,我想显示一个指向另一篇随机博文的预告链接。显然,这个链接不应该是当前帖子本身的预告片。
我已经想出了如何选择随机帖子,但是预告链接仍然有可能是指向当前帖子的链接。我想不通,我该如何排除这种情况。
这是我的控制器:
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。
【问题讨论】:
【参考方案1】:使用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)
【讨论】:
非常感谢您的回答。我尝试了您的解决方案,但不幸的是我收到一个错误:ArgumentError in PostsController#show - 参数数量错误(0 代表 1) 我会尽快尝试,尝试将 RANDOM() 用双引号括起来 再次感谢!非常感谢!不幸的是,双引号并不能解决它。 你的@post 设置是什么?你能检查一下吗? “设置为”是什么意思?哪个“身份证”? (顺便说一句:我正在使用 'friendly_id' Gem,这会造成什么麻烦吗?)【参考方案2】:这取决于您希望集合有多大。最简单的是:
@staff_pickrandom = Post.where(staff_pick:true).sample
这将从Post.where(staff_pick:true)
返回的数组中选择一个随机对象。如果您发现记录太多,则可以在 where 子句中添加更多记录
【讨论】:
非常感谢您的建议。看起来不错,但我得到一个错误。不确定,为什么:NoMethodError in Posts#show undefined method `each' for #<0x00000109d00a98>0x00000109d00a98>【参考方案3】: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
有很多方法可以做到这一点。最好创建一个助手。
【讨论】:
非常感谢!我正在为您的解决方案苦苦挣扎,因为我使用了这个“where(staff_pick:true)”部分。随机帖子不是从所有帖子的数组中选择的,而是从一系列帖子中选择的。【参考方案4】:试试:
@post = Post.where(staff_pick: true).where.not(id: params[:id]).shuffle.first
如果 where.not
不能像在 Rails 4 中那样完成,请尝试:
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
。
我想应该可以!
【讨论】:
迭戈,谢谢!我正在使用 Rails 3.2,所以我尝试了您的第二个建议。不幸的是,我收到此错误:ActiveRecord::StatementInvalid in PostsController#show PG::InvalidTextRepresentation: ERROR: invalid input syntax for integer: "a-dummy-post-with-all-elements" 我正在使用“friendly_id”宝石。这可能是错误的原因吗? 是的......完全。让我试着写点别的。一秒。 尝试在之前将帖子声明为实例变量,并使用它的 id。我已经更新了答案。以上是关于Rails - 显示随机记录但不显示当前记录的主要内容,如果未能解决你的问题,请参考以下文章