我想问下如果要实现一个链接可以随机转到社区的某个帖子,这该如何实现
我自己想的一个方法...刚学 rails 没多久。在 controller 端获得一个@blog=Blog.last,前台做一个<%form_tag blog,:method=>"post"%> <%=hidden_field_tag(:id,value=rand(Time.now.to_i)%@blog.id)%>,额,这个方法不好,但应该能实现吧~~~
可以通过随机 id 实现
def pickme
items = Item.select('id')
item = Item.find(items[Random.rand( items.length)])
redirect_to item_path(item)
end
上面这个性能不会太好,需要在这个基础上,给 Item.select('id') 加上缓存或随机分页
def random_topic random_topic unless topic = Topic.find(rand 3000) end
30000 就是个占位,填进数据的大概数目就行了
只能保佑 id 字段是连续的不会缺号,不然Random.rand( items.length)
会得到一个 nil 的对象出来,
如果有判断是否是已删除帖子之类的delete_flag
字段的话,这里应该也要带上这个字段一起检索
刚才在一张 200w 的表上测了下
item = Item.find(Item.pluck(:id).sample)
其实只是去查询主键 id 而已,1 秒很快的
(1131.2ms) SELECT id FROM `users`
User Load (0.7ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1764711 LIMIT 1
看起来是个假想的问题。想不出在实际项目里面在在足够大的表里面随机取记录对用户体验有什么帮助。加入任何的约束,比如说在最近 x 天,或者依靠某种相关度的算法,都是对用户体验的提升。
@其实我是在果壳网看到的一篇文章,关于作者做了一个能随机进入一篇文章的链接http://www.guokr.com/blog/412815/ 我觉得实际项目中还是可能有这样的需求
Topic.order("updated_at desc").first 最后一个更新过的帖子,基本上就是随机了. 如果是 order rand,遇上贴子数量多,那服务器吃不消
#18 楼 @knwang 应该有这种情形,现在一般网站的大众审贴功能,每次给用户随机呈现一个审核未通过的帖子,审核一个帖子跳到下一个随机的帖子。貌似 sql 语句能达到要求。http://www.111cn.net/database/mysql/40168.htm