在Rails中,find_each和where之间有什么区别?

cod*_*erz 52 ruby activerecord ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

在Rails中,find_eachwhere用于从ActiveRecord支持的数据库中检索数据.

您可以将查询条件传递给where,例如:

c = Category.where(:name => 'Ruby', :position => 1)
Run Code Online (Sandbox Code Playgroud)

您可以将批量大小传递给find_each,例如:

Hedgehog.find_each(batch_size: 50).map{ |p| p.to_json }
Run Code Online (Sandbox Code Playgroud)

但是以下两个代码有什么区别?

# code 1
Person.where("age > 21").find_each(batch_size: 50) do |person|
  # processing
end

# code 2
Person.where("age > 21").each do |person|
  # processing
end
Run Code Online (Sandbox Code Playgroud)

代码1批次每次检索50个元组,代码2一次检索所有元组吗?欢迎更多细节解释.

我的意见是:

  1. wherefind_each可用于批量检索,但是用户可使用时限定批量大小find_each.
  2. find_each 不支持传递查询条件.

如果我的理解是错误的,请纠正我.

jph*_*er2 75

活动记录关系不会自动将所有记录加载到内存中.

当你打电话时#each,所有记录都将被加载到内存中.当您调用时#find_each,记录将以给定批量大小的批量加载到内存中.

因此,当您的查询返回一些记录,这些记录对于服务器的可用资源而言将是太多内存,那么使用#find_each将是一个很好的选择.

这基本上就像使用Ruby的懒惰枚举#to_enum#lazy#each_slice,然后#each(很方便).