得到模型里的所有的对象,可以使用它的 all 这个方法 ..
User.all
返回的是一个集合 .. 如果模型里的记录少,使用这个方法还行,太多的话就不行了,因为记录可能会占用服务器的所有的内存 ..
可以用 find_each 这个方法,它会先检索一批记录,然后把这批记录一个一个的交给代码块去处理 .. 还有个 find_in_batches 方法,它也会先检索一批记录,然后把整批记录统一交给代码块去处理 ..
find_each
先试一下 find_each .. 使用 User 模型的 find_each 方法 .. 给它一个代码块 .. 加上一个参数是 user,表示用户 .. 在代码块的主体里,输出用户的 name 属性 ...
返回的就是 User 模型里的用户的名字 ... 注意这个方法对应的 SQL ...
SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC LIMIT 1000
这里有一个 LIMIT,限制了检索的记录的数量,现在它的值是 1000,也就是 find_each,会先检索出 users 里的 1000 条记录,一条一条的处理它们,然后还有记录的话,会检索下一批记录,数量也是 1000 ...
这个批次的数量我们可以修改一下 ... 用一下 User 的 find_each ... 给它一个 batch_size 参数,它的值就是每批次的数量 .. 设置成 1 .. 再提供一个代码块 ... 一个 user 参数 ... 然后输出它的 name 属性 ..
这次你会发现 .. 这个方法会先检索出第一批记录,数量是 1 ... 输出用户的名字 .. 然后又会检索下一批记录,数量也是 1 ... find_each 会继续检索模型里的记录,直到最后一条为止 ...
你可能希望处理一部分记录,可以使用 :start 还有 :finish 设置开始还有结束的记录 .. User.find_each ... start 设置一下开始的位置 ... finish 设置一下结束的位置 .. .再用一下 batch_size .. 设置一下每批记录的数量 .. 提供一个代码块 ... user 参数表示用户 .. 输出它的 name 属性 ..
User.find_each(start: 2, finish: 3, batch_size: 1) do |user|
这样 find_each 会从第二条记录开始,到第三条结束 ... 每批记录的数量是 1 ...