我有一个活动的记录关系,定义如下:
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
将不会返回任何内容,因为状态之前已更新。
由于
答案 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