Rails 3选择随机跟随者查询效率

时间:2011-06-07 15:54:10

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

我有一个方法可以选择跟随某个用户的5个随机用户,并将它们添加到数组中。

Relationship.find_all_by_followee_id( user.id ).shuffle[0,4].each do |follower|
   follower = User.find(follower.user_id)
   array.push follower
end
return array

我想知道,这是实现这一目标的有效方法吗?我主要关注的是find_all_by_followee_id调用。这将返回指定用户所遵循的所有关系的列表(可能在100,000s内)。然后我将整个列表洗牌,然后将其修改为第一个5.是否有更有效的方法来执行此操作?

1 个答案:

答案 0 :(得分:1)

你可以试试这个:

Relationship.find_all_by_followee_id( user.id, :order => 'rand()', :limit => 5 ) do |follower|
   follower = User.find(follower.user_id)
   array.push follower
end
return array

顺便说一句,这将适用于MySql。如果您正在使用PostgreSQL或其他任何东西,您可能需要使用您的数据库支持的任何有效随机函数更改rand()

进行一些小改动,使其更加干净:

return Relationship.find_all_by_followee_id( user.id, :order => 'rand()', :limit => 5 ).collect {|follower| User.find(follower.user_id) }

你也可以在那里使用连接以防止5个选择,但它不会有太大的区别。

EDIT1:

正如@ mike.surowiec所说。

“仅为了每个人的利益,将其转换为非弃用的活动记录查询语法如下所示:”

Relationship.where(:followee_id => user.id).order( "random()" ).limit( 5 ).collect {|follower| User.find(follower.user_id) } 
相关问题