【问题标题】: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 个用户,并将它们一一交给您的“用户代码”块。如果您愿意,可以指定不同的块大小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-21
        • 1970-01-01
        相关资源
        最近更新 更多