我有一个名为Stack的模型,它是后台工作人员要完成的任务的列表.到目前为止,它只有一个后台工作人员做这项工作,但随着时间的推移,它变得有点臃肿,有点慢,堆栈是...好的,堆积起来.
就这个问题而言,假设这就是模型.
class Stack < ApplicationRecord
enum state: { queued: 0, processing: 1, third_state: 2, fourth_state: 3 }
validates :state, :object_name, :object_id, presence: true
end
因此,Stack有一款state
、object_name
和一款object_id
正在研发中.
在我们的数据库中,我们有以下Stack条目;
{ id: 1, state: :processing, object_name: "Car", object_id: 1 }
{ id: 2, state: :queued, object_name: "Car", object_id: 1 }
{ id: 6, state: :queued, object_name: "Car", object_id: 2 }
{ id: 7, state: :queued, object_name: "Truck", object_id: 2 }
我希望能够将上面的id:6作为下一个"队列",因为从理论上讲,另一个Worker已经在处理id:1,而我们不希望它拉出id:2,因为任务的主题与当前正在处理的id:1具有相同的对象名称和对象ID.
那么,如何获取堆栈中的下一个正在排队的对象,而不是如果它的对象在堆栈中的其他位置被处理呢?
我觉得我应该能够做一些事情,比如;
Stack.with_state(:queued).where.not("object_id = ? and object_name = ?",
Stack.without_state(:queued).pluck(:object_id, :object_name).uniq ).to_sql
但这是行不通的,因为"对象id=?和对象名称=?"需要两个参数,因为我输入的查询给出了一个具有两个元素的数组array.
有什么 idea 吗?