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

标签 ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 activerecord

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

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

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

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

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

代码1是不是每次批量取50个元组,代码2是一次性取完所有元组?欢迎提供更多详细信息。

我的观点是:

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

如果我的理解有误,请指正。

最佳答案

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

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

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

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

关于ruby-on-rails - 在 Rails 中,find_each 和 where 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30010091/

相关文章:

mysql - 将 Ruby API 请求信息记录到数据库

ruby-on-rails - 为类调用私有(private)方法选择 - Rails

ruby-on-rails - 使用 form_for :remote => true? 成功验证后可以重定向吗

jquery - Rails 4. jQuery、Acts_as_list、嵌套模型、更新 Controller 中的位置

php - PHP MD5 key 的等效 ruby​​ 代码

ruby - 提取 gem 后如何修复 RubyGems.org 项目页面?

ruby-on-rails - 将变量从 .txt 文件插入 ERB

ruby-on-rails - Rails 如何在浏览器中编辑和保存文件?

ruby-on-rails - 如何在 Controller 中调用 rake 任务?

Mysql2::Error: # MySQL 客户端未连接 — Rails 6.0.2.2 with rspec; Ruby 2.6.4 mac os Catalina + Mojave