Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中,find_each和where之间有什么区别?_Ruby On Rails_Ruby_Ruby On Rails 3_Ruby On Rails 4_Activerecord - Fatal编程技术网

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

Ruby on rails 在Rails中,find_each和where之间有什么区别?,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,Activerecord,在Rails中,和都用于从ActiveRecord支持的数据库检索数据 您可以将查询条件传递到何处,如: 您可以传递批大小来查找每个,如: 但以下两种代码之间有什么区别 # 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 e

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

您可以将查询条件传递到何处,如:

您可以传递批大小来查找每个,如:

但以下两种代码之间有什么区别

# 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是否一次检索所有元组?欢迎提供更多详细说明

我的意见是:

where和find_都可以用于批检索,但用户可以在使用find_时定义批大小。 find\u each不支持传递查询条件。
如果我的理解有误,请更正。

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

调用每个时,所有记录都将加载到内存中。当您调用find_each时,记录将以给定的批大小批量加载到内存中

因此,当您的查询返回的记录数量对于服务器的可用资源来说太多时,使用find_将是一个很好的选择


这基本上就像使用ruby的惰性枚举来惰性枚举每个片段,然后每个片段都非常方便。

所以代码1可以根据记录大小和批大小多次执行SQL,代码2只执行SQL一次?是的,这是我的理解。如果您查看开发日志或rails控制台中的sql输出,您将看到类似于Users.for_eachbatch_size{| u |}选择用户。*从Users.id>51的用户中选择用户。*从Users.id>51的用户中选择限制50。。。等等
Hedgehog.find_each(batch_size: 50).map{ |p| p.to_json }
# 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