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

Ruby on rails Rails 3选择随机跟随者查询效率,ruby-on-rails,ruby,ruby-on-rails-3,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 我想知道,这是实现这一目标的有效方法吗?我主要关心的是通过followee-id呼叫查找所有信息。

我有一个方法,选择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
我想知道,这是实现这一目标的有效方法吗?我主要关心的是通过followee-id呼叫查找所有信息。这将返回指定用户所遵循的所有关系的列表(可能是100000)。然后我洗牌整个列表,然后把它修剪到前5个。有没有更有效的方法

您可以尝试以下方法:

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或其他任何东西,您可能需要使用DB支持的任何有效随机函数更改
rand()

一些小改动使其更干净:

return Relationship.find_all_by_followee_id( user.id, :order => 'rand()', :limit => 5 ).collect {|follower| User.find(follower.user_id) }
您也可以在那里使用连接来防止5次选择,但这不会有多大区别

编辑1:

如@mike.surowiec所述


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

您可以尝试以下方法:

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或其他任何东西,您可能需要使用DB支持的任何有效随机函数更改
rand()

一些小改动使其更干净:

return Relationship.find_all_by_followee_id( user.id, :order => 'rand()', :limit => 5 ).collect {|follower| User.find(follower.user_id) }
您也可以在那里使用连接来防止5次选择,但这不会有多大区别

编辑1:

如@mike.surowiec所述


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


谢谢,这真是太棒了!另外,感谢“.collect”,我知道ruby可以自动返回,但不知道如何使用数组(如果你不知道,我来自Java背景)。实际上,在第二个“cleaner”版本中,返回是不必要的。@Blizzo,你不知道调用的范围。如果它是方法的代码,并且它只是这样做,那么您是对的,但是代码块可能是更复杂流的一部分。它可能是if块的一部分,可以切断当前方法的执行。为了每个人的利益,将其转换为未弃用的活动记录查询语法如下:Relationship.where(:followee_id=>user.id)。order(“random()”).limit(5)。collect{follower | user.find(follower.user_id)}谢谢@mike.surowiec。我使用的是Rails 2.3应用程序,这是我能够提交的更安全的答案。谢谢,这非常有效!另外,感谢“.collect”,我知道ruby可以自动返回,但不知道如何使用数组(如果你不知道,我来自Java背景)。实际上,在第二个“cleaner”版本中,返回是不必要的。@Blizzo,你不知道调用的范围。如果它是方法的代码,并且它只是这样做,那么您是对的,但是代码块可能是更复杂流的一部分。它可能是if块的一部分,可以切断当前方法的执行。为了每个人的利益,将其转换为未弃用的活动记录查询语法如下:Relationship.where(:followee_id=>user.id)。order(“random()”).limit(5)。collect{follower | user.find(follower.user_id)}谢谢@mike.surowiec。我使用的是Rails 2.3应用程序,这是我能够提交的更安全的答案。