我有一个方法可以选择跟随某个用户的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.是否有更有效的方法来执行此操作?
答案 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) }