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

Ruby on rails 更好的随机化方法(Ruby/Rails 3),ruby-on-rails,ruby,ruby-on-rails-3,activerecord,random,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,Random,我目前正在使用: @users=User.order(“RANDOM()”).limit(6) 要生成6个随机用户的列表-但是,此方法需要1200毫秒的页面加载时间。有没有一种更快/更有效的方法来调用6个随机用户?您可以尝试使用array shuffle而不是mysql random,因为它可能会很慢: @users = User.all.shuffle[0..5] 毕竟,ActiveRecord对象的集合仍然只是一个数组假设自动递增ID,从0开始,并且用户对象永远不会被删除,那么以下操作应该

我目前正在使用:

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


要生成6个随机用户的列表-但是,此方法需要1200毫秒的页面加载时间。有没有一种更快/更有效的方法来调用6个随机用户?

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

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

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

假设自动递增ID,从0开始,并且用户对象永远不会被删除,那么以下操作应该非常快:


@users=(0..5).map{User.find(rand*User.count)}
您是否尝试过使用随机偏移量和限制

class User < ActiveRecord::Base

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

end

@users = User.random(6)
class用户

我使用了类似的方法从AR中获取单个随机实例。如果你想保证唯一的结果,就必须让它变得更智能。

你可以获得一个随机的用户页面。考虑使用/P>此分页调用
这将触发一个计数查询和一个针对6个用户的页面的查询

我最终使用了下面描述的方法:


@谢谢你的评论。加载时间现在快多了:)

类似这样的情况?您是否考虑过:此代码有效,但加载时间相同:(这也会加载整个用户集合-随着用户记录数量的增加,性能会变得更差。加载整个集合不是您想要做的事情,如果数据库这样做,您将不需要获取每一行。此外,如果缓存User.count.Excluded的结果,为了简洁和清晰,它会更快。
User.order('created_at').page(rand(User.count)).per(6)