我想对数据库中的每个用户执行一些代码。为此,我创建了一个脚本,并使用rails runner myscript.rb
运行它
User.all.each do |user|
# code on user
end
如果我的数据库中有500个用户,这是可行的,但如果我有4000个用户,在给定用户数量的情况下,.each
中的一些代码会导致一些错误。(这些数字是虚构的(
出于这个原因,我希望每隔500个用户执行一次这个脚本。
如何每500个用户执行一次,直到没有更多用户为止?
使用find_each
:
循环遍历数据库中的记录集合(例如,使用
Scoping::Named::ClassMethods.all
方法(效率非常低,因为它将尝试一次实例化所有对象。在这种情况下,批处理方法允许您批量处理记录,从而大大减少内存消耗。
你想说:
User.find_each do |user|
# code on user
end
这将一次加载用户1000,并将它们一个接一个地交给您的"代理";用户代码";块如果愿意,可以指定不同的区块大小。
您可以在while do循环下执行此操作,并且用户对象可以设置为User.all.sample
。这样做,直到没有用户了,你的脚本就会工作,然后退出。但是你应该在你的桌子上加一个标志。
假设您正在尝试向所有用户发送电子邮件,并且应该有一个类似于email_sent
的字段作为标志。
现在您的用户对象是User.all.where(email_sent: true).sample
另一种方法可能使用按用户查询作业。在用户之间创建一个循环,并拥有该循环的索引。设置索引amount_of_time秒以启动查询。因此,如果您有1000个用户,并且在用户之间设置索引2秒的缓冲区。这需要2000秒。以处理查询的所有作业。
还有其他解决方案。如果你能更好地解释你在寻找什么以及你需要什么练习;我可以建议你一个更好的。