添加验证到DelayedJob?

时间:2014-08-06 11:26:33

标签: ruby-on-rails ruby delayed-job

我想对添加到我的DelayedJob队列中的作业添加一些限制。

例如,当我这样做时:

Delayed::Job.enqueue Something.new(id)

我喜欢和#34; validates_uniqueness"类似的东西。这会为同一个ID停止多个作业。

有关如何组织此类代码的任何想法?

不确定在何处进行验证。特别是看到我的队列可能有多种不同类型的工作类?

1 个答案:

答案 0 :(得分:2)

执行此操作的standard way是将验证推迟到延迟的作业并进入您的应用程序。也就是说:您允许系统安排多个作业,而您的代码确保它只运行一次。 aasm gem可能有助于您管理自己的州。

例如,假设您有一个Person模型,其中包含nameage字段,并且您希望通过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;状态一次。

最后,如果你知道你的模型上只有两个状态(例如,你不需要区分待处理/处理/完成/失败)那么使用布尔标志会更简单。