rails - 预取要在队列中处理的记录

时间:2017-07-28 02:03:30

标签: ruby-on-rails activerecord

我有一个活动的记录关系,定义如下:

contacts = Contact.where("status = 'waiting'")

然后,我执行以下操作:

if contacts

    batch_id = randomStringOfLength(32)

    #Set to processing
    contacts.update_all(status: 'processing', batch_id: batch_id)

    #TODO: Is this the best way to do this? 
    contacts = Contact.where("batch_id = ?", batch_id)

    contacts.each do |contact|

         executeFor(contact)

    end
end

如您所见,我必须使用特定的batch_id更新记录,以便以后能够获取它们。

这是因为我的第一个联系人实例实际上并没有获取记录。第一个数据库调用是状态processing的更新,然后通过batch_id获取它们允许我运行每个循环。

有更好的方法吗?虽然我已将batch_id编入索引,但我认为在rails中可能有更好的方法。

如果我不更新batch_id并删除要batch_id提取的行,那么.each将不会返回任何内容,因为状态之前已更新。

由于

1 个答案:

答案 0 :(得分:0)

如果您的数据库中不需要batch_id,则可以编写以下内容:

contacts = Contact.where(status: 'waiting')
if contacts

    #Set to processing
    contacts.update_all(status: 'processing')

    #TODO: Is this the best way to do this? 
    contacts = Contact.where(status: 'processing')

    contacts.each do |contact|
         executeFor(contact)
    end
end

这个选项可能会更快一些:

if Contact.where(status: 'waiting').update_all(status: 'processing') > 0
    contacts = Contact.where(status: 'processing')

    contacts.each do |contact|
         executeFor(contact)
    end
end

不要忘记检查数据库中的索引。状态需要一个。

保持batch_id

batch_id = randomStringOfLength(32)
if Contact.where(status: 'waiting').update_all(status: 'processing', batch_id: batch_id) > 0
    contacts = Contact.where(batch_id: batch_id)

    contacts.each do |contact|
         executeFor(contact)
    end
end