2014-02-17 160 views
2

在博客文章的末尾,我想显示一个传情链接到另一个随机文章。显然这个链接应该不是当前文章本身的传情。Rails - 显示随机记录但不是当前记录

我想出了如何选择一个随机帖子,但传情链接仍然是链接到当前帖子的机会。我无法弄清楚,我怎么能排除这种情况。

这里是我的控制器:

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

使用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) 
+0

Thx很多为您的答案。我试过你的解决方案,但不幸的是我得到一个错误:PostsController中的ArgumentError#显示 - 错误的参数数量(0代表1) – YvonC

+0

我会尽快尝试用双引号将RANDOM()包装起来 – blotto

+0

再次感谢!非常感谢!不幸的是双引号不能解决它。 – YvonC

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 

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

+0

非常感谢!我正在努力解决您的问题,因为我使用这个“where(staff_pick:true)”部分。随机帖子不是从所有帖子的数组中挑选出来的,而是从一系列帖子中挑选出来的。 – YvonC

0

这取决于你想要多大的设置。最简单的是:

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

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

+0

非常感谢您的建议。看起来不错,但我得到一个错误。不知道,为什么: NoMethodError在帖子#显示 未定义的方法'每个'为#<发布:0x00000109d00a98> - (如果我使用我的控制器见上面,一切正常) – YvonC

0

尝试:

@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代替。

我想这应该工作!

+0

迭戈,谢谢!我使用Rails 3.2,所以我尝试了第二个建议。不幸的是我得到这个错误:PostsController中的ActiveRecord :: StatementInvalid#show PG :: InvalidTextRepresentation:错误:无效输入语法为整数:“a-dummy-post-with-all-elements” – YvonC

+0

我使用'friendly_id'宝石。这可能是错误的原因吗? – YvonC

+0

是的...完全。让我试着写点别的东西。 1秒。 –