我想对添加到我的DelayedJob队列中的作业添加一些限制。
例如,当我这样做时:
Delayed::Job.enqueue Something.new(id)
我喜欢和#34; validates_uniqueness"类似的东西。这会为同一个ID停止多个作业。
有关如何组织此类代码的任何想法?
不确定在何处进行验证。特别是看到我的队列可能有多种不同类型的工作类?
答案 0 :(得分:2)
执行此操作的standard way是将验证推迟到延迟的作业并进入您的应用程序。也就是说:您允许系统安排多个作业,而您的代码确保它只运行一次。 aasm gem可能有助于您管理自己的州。
例如,假设您有一个Person
模型,其中包含name
和age
字段,并且您希望通过delayed_job将其名称修改为标题大小写。像这样:
class Person < ActiveRecord::Base
include AASM
aasm do
state :unprocessed, :initial => true
state :done
event :capitalize do
transitions :from => :unprocessed, :to => :done
end
end
def fix_name
self.name.split.each(&:capitalize!).join(' ') unless self.done?
self.capitalize
self.save
end
end
# Elsewhere in your code...
p = Person.new({name: "bob geldof"})
Delayed::Job.enqueue p.fix_name
我们正在使用aasm为我们的工作提供两种状态:&#34;未经处理的&#34;和&#34;完成&#34;。仅当我们的模型没有完成状态时,fix_name
代码才会运行。无论我们将呼叫排入fix_name
多少次,它只会运行一次,因为我们的模型只能转移到&#34;完成&#34;状态一次。
最后,如果你知道你的模型上只有两个状态(例如,你不需要区分待处理/处理/完成/失败)那么使用布尔标志会更简单。