【问题标题】:ActiveRecord find records in intervalsActiveRecord 以间隔查找记录
【发布时间】:2022-01-06 13:54:11
【问题描述】:
我想对我数据库中的每个用户执行一些代码。为此,我创建了一个脚本并使用 rails runner myscript.rb
运行它
User.all.each do |user|
# code on user
end
如果我的数据库中有 500 个用户,这可行,但如果我有例如 4000 个用户,考虑到用户数量,.each 中的一些代码会出现一些错误。 (这个数字是虚构的)
因此,我想以 500 个用户为间隔执行此脚本。
如何每 500 个用户执行一次,直到没有更多用户?
【问题讨论】:
标签:
ruby-on-rails
ruby
rails-activerecord
【解决方案1】:
你可以在while do循环下进行,用户对象可以设置为User.all.sample。通过这样做,直到没有用户离开,您的脚本将运行然后退出。但是你应该在你的表中添加一个标志。
假设您正在尝试向所有用户发送电子邮件,并且您应该有一个类似于email_sent 的字段用作标志。
现在你的用户对象是User.all.where(email_sent: true).sample
另一种方法可能是使用用户查询作业。通过您的用户创建一个循环并拥有循环的索引。设置 indexamount_of_time 秒以开始查询。因此,如果您有 1000 个用户并且您在用户之间设置索引2 秒的缓冲区。这将需要 2000 秒。处理所有查询的作业。
还有其他解决方案。如果你能更好地解释你在寻找什么以及你需要什么练习;我可以给你推荐一个更好的。
【解决方案2】:
使用find_each:
循环访问数据库中的记录集合(例如,使用Scoping::Named::ClassMethods.all 方法)效率非常低,因为它会尝试一次实例化所有对象。
在这种情况下,批处理方法允许您批量处理记录,从而大大减少内存消耗。
你想说:
User.find_each do |user|
# code on user
end
这将一次加载 1000 个用户,并将它们一一交给您的“用户代码”块。如果您愿意,可以指定不同的块大小。