每个还是find_each?还是需要smart_each?

时间:2018-05-04 22:17:10

标签: ruby-on-rails performance

我有这样的代码:

User.any_scope.each do |user|
  user.do_anything
end 

如果我有大量用户:

User.any_scope.find_each do |user|
  user.do_anything
end

如果用户数< 100:

使用find_each

的性能不是一个好主意

这样的代码怎么样:

def smart_each_for(user)
  MAX_COUNT = 100
  user.count > MAX_COUNT ? 'find_each' : 'each'  # 100 - 
end

smart_each = smart_each_for(User.any_scope)

User.any_scope.send :smart_each do |user|
  user.do_anything
end

性能好吗? MAX_COUNT怎么样?这个变量应该有什么价值?

1 个答案:

答案 0 :(得分:2)

请参阅find_each方法的文档:

  

注意:无法设置订单。这是自动设置为   在主键(“id ASC”)上升序以进行批量订购   工作。这也意味着此方法仅在主键时有效   是可订购的(例如整数或字符串)。

     

注意:您也无法设置用于控制批次的限制   尺寸。

     

注意:就其性质而言,批处理受竞争条件限制   其他进程正在修改数据库。

     

注意:此方法仅用于批处理   大量记录不能同时存储在内存中。如果   你可能只需要循环不到1000条记录   最好只使用常规查找方法。

所以不,在你提供的例子中使用它不是一个好主意。