【问题标题】:In Rails, what's the difference between find_each and where?在 Rails 中,find_each 和 where 有什么区别?
【发布时间】:2015-07-12 15:44:32
【问题描述】:

在 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

code 1 是否每次批量检索 50 个元组,code 2 一次检索所有元组?欢迎详细说明。

我的看法是:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 那么代码1可能会执行多次SQL(根据记录大小和批量大小),代码2只执行一次SQL?
    • 是的,这是我的理解。如果您查看您的开发日志或查看 rails 控制台中的 sql 输出,您会看到类似 Users.for_each(batch_size) {|u| } SELECT "users"."*" FROM "users" WHERE ("users"."id" > 51) SELECT "users"."*" FROM "users" WHERE ("users"."id" > 51) LIMIT 50 ... 等等
    • users = User.where(:birth_day < Date.today) 如果我们拨打此行,我们没有拨打#each。但是您确定我们不会将所有数据都加载到users 变量中吗?
    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2022-11-15
    相关资源
    最近更新 更多