像User.find(:all).each这样的代码有什么问题?

Bus*_*ark 3 ruby ruby-on-rails

我刚刚在工作列表上阅读了这个要求:

意识到代码的陷阱,如: User.find(:all).each

我立刻知道我没有资格从事这项工作,因为对于我的生活,我不明白问题是什么.是吗...

  • 设计相关?我应该将数据库请求存储在变量中然后迭代它吗?
  • 危险吗?
  • 太罗嗦了?我应该用User.all.each吗?(-1字!w00t!)
  • 措辞简单?它应该以"用户表恰好有300万行"开头吗?

Kev*_*son 7

我认为他们正在寻找的"陷阱"是当有人写User.all.each时,它通常看起来像这样:

User.all.each do |u|
    next if !u.is_active
    ...
end
Run Code Online (Sandbox Code Playgroud)

这意味着,在从DB加载了每个对象的全部内容之后,过滤发生在过滤器中,当通过在查询中表达所需属性来更有效地完成过滤时.


Rya*_*igg 5

执行User.all将加载所有用户记录.如果你有300万条记录,它将加载所有300万个对象.这就是为什么这是一个坏主意.最好使用分页或条件等方法过滤SQL,以返回"完成工作"所需的最小子集