ActiveRecord在间隔中查找记录



我想对数据库中的每个用户执行一些代码。为此,我创建了一个脚本,并使用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秒。以处理查询的所有作业。


还有其他解决方案。如果你能更好地解释你在寻找什么以及你需要什么练习;我可以建议你一个更好的。

相关内容

  • 没有找到相关文章

最新更新