返回填充ActiveRecord UUID

时间:2017-08-16 18:09:18

标签: ruby-on-rails activerecord

我试图找到一种更有效的方法来支持使用uuids填充ActiveRecord模型。大约有500K记录。

这是我目前正在尝试的内容:

clause = ['uuid is null and created_at >= ?', DateTime.new(2017, 8, 15)]
MyTable.where(clause) do |record|
  record.uuid = SecureRandom.uuid
  record.save
end

这会产生多个更新语句,效率很低。

我查看了update_all,但更新部分似乎只被评估一次,因此为所有记录设置了相同的UUID。

MyTable.where(clause).update_all(uuid: SecureRandom.uuid)

有没有办法用这些条件进行批量更新,并为每个条件生成一个新的UUID?

1 个答案:

答案 0 :(得分:0)

Person.find_each do |person| # will only load 1000 records at a time person.do_awesome_stuff end 就是为了做到这一点:http://api.rubyonrails.org/classes/ActiveRecord/Batches.html

  

循环[大]记录集[...]是非常低效的,因为它会尝试一次实例化所有对象。

     

[...]批处理方法允许您批量处理记录,从而大大减少内存消耗。

     

find_each方法使用批量大小为1000(或者由:batch_size选项指定)。

def Signal_Handler(signal):
    FIFO.push(signal.job_data)

def main(job_data):
  while True:
    process_Job(job_data)
    job_data = FIFO.pop()
    if not job_data:
        break

if __name__ == '__main__':
    job_data = sys.argv[1]
    if Lock_Programm():
        # First Instance
        Signal.Handler(SIG_USR1, Signal_Handler)
        main(job_data)
        Unlock_Programm()

    else:
        # Lock failed other Instance is running
        Signal.signal(SIG_USR1, job_data)
        exit(1)