更好的随机化方法(Ruby / Rails 3)

时间:2011-06-19 23:17:09

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord random

我目前正在使用:

  

@users = User.order(“RANDOM()”)。limit(6)

生成一个包含6个随机用户的列表 - 但是,此方法在页面加载时间上需要1200毫秒的费用。是否有更快/更有效的方式来呼叫6个随机用户?

5 个答案:

答案 0 :(得分:1)

我最终使用了此处描述的方法: Rails select random record

@ramc - 感谢您的评论。加载时间现在要快得多:)

答案 1 :(得分:0)

假设自动增量ID,从0开始并且永远不会删除User对象,以下内容应该非常快:

@users = (0..5).map { User.find(rand * User.count) }

答案 2 :(得分:0)

您是否尝试过使用随机偏移量&限制?

class User < ActiveRecord::Base

  def self.random num = 1
    num.times.map { offset(rand(count)).limit(1) }
  end

end

@users = User.random(6)

我使用类似的东西从AR中获取单个随机实例。如果你想保证独特的结果,你必须让它变得更聪明。

答案 3 :(得分:0)

您可以获得一个随机的用户页面。请使用Kaminari

考虑此分页调用
User.order('created_at').page(rand(User.count)).per(6)

这将触发一个计数查询和一个查询6个用户的页面

答案 4 :(得分:-2)

您可以尝试使用数组shuffle而不是使用mysql random,因为它可能很慢:

@users = User.all.shuffle[0..5]

毕竟,ActiveRecord对象的集合仍然只是一个数组