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

In Rails, what's the difference between find_each and where?

在Rails中,find_each and where都用于从ActiveRecord支持的数据库中检索数据。

你可以把你的查询条件传给where,比如:

c = Category.where(:name => 'Ruby', :position => 1)

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

Hedgehog.find_each(batch_size: 50).map{ |p| p.to_json }

但是下面2个代码有什么区别呢?

# 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

代码1是不是每次批量取50个元组,代码2是一次性取完所有元组?欢迎详细说明。

我的看法是:

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

理解有误请指正

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

当您调用#each时,所有记录将被加载到内存中。当您调用 #find_each 时,记录将按给定的批量大小分批加载到内存中。

因此,当您查询 returns 多条记录时,对于服务器的可用资源来说内存过多,那么使用 #find_each 将是一个不错的选择。

基本上就像使用ruby的惰性枚举#to_enum#lazy#each_slice然后#each(非常方便)。