在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将是一个很好的 Select .

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

Ruby-on-rails相关问答推荐

Rails7--如何使用内联代码仅为操作运行BEFORE操作

Rails6.1|有没有一种方法可以判断哪些关联已经加入到一个范围中?

用变量替换 find_or_create_by 中的键

使用带有 Paper Trail gem 的子类

select2 未应用于所有下拉列表;它只适用于数据的最后一条记录

Rails 7 共享刺激控制器功能

Rails - 按连接表数据排序

Rails:如何访问 RESTful 助手?

如何使用 Capistrano gem 为生产数据库 seeder ?

jbuilder vs rails-api/active_model_serializers 用于 Rails 4 中的 JSON 处理

jQuery ajax 请求不会触发 Rails 控制器的 JS 响应?

Ruby on Rails 中的消息队列

将 Amazon SES 与 Rails ActionMailer 结合使用

如何将 yaml 文件解析为 ruby​​ 哈希和/或数组?

使用god 监控独角兽 - 以非零代码开始退出 = 1

Rails 中是否有 HTML 安全截断方法?

在 Rails 生产中禁用assets资源 缩小

在 ruby​​ on rails 中创建自定义 html 助手

Rspec:如何在控制器规范中分配实例变量

如何设置 MiniTest?