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>【参考方案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 - 显示随机记录但不显示当前记录的主要内容,如果未能解决你的问题,请参考以下文章

Rails:用按钮隐藏记录,找不到ID错误的记录

Rails 使用 will Paginate 进行搜索

在 rails 中显示关联的记录

Rails删除终端中的记录,但RSpec仍然显示在那里的记录

如何在 Rails 4.0 表单中显示选定记录中的关联值

PHP:在文件中记录错误但不将它们显示给 POST/GET 请求