0

我正在从after_create回调中调用“队列”方法,以在模型实例创建后触发 Sidekiq 进程。然而,我的 Sidekiq 工人第一次接手工作,记录还没有提交。

我知道有一条after_commit记录,但我只希望对象在创建时排队,而不是在更新时排队。如果没有任何涉及日期检查等的黑客行为,我如何才能做到这一点?

4

2 回答 2

1

before_create你可以在回调中设置一个标志

before_create :set_new_flag
after_commit :queue

def set_new_flag
  @__new_flag = true
end

def queue
  if defined? @__new_flag
    #queue it up
    remove_instance_variable(:@__new_flag)
  end
  # puts self.previous_changes
end

或者只是#previous_changesafter_commit. nilin id 键应仅用于 new_records 。这是一个示例输出previous_changes

{"name"=>[nil, "newest"], "id"=>[nil, "cBdjzQgxir45xQJ9UXGRSR"], "version_id"=>[nil, "cBdnAogxir45xQJ9UXGRSR"]}
于 2013-09-09T17:18:27.193 回答
1

正确的方法是使用:on选项:

after_commit :queue, :on => :create

更多信息:http: //api.rubyonrails.org/v3.2.13/classes/ActiveRecord/Transactions/ClassMethods.html#method-i-after_commit

于 2014-02-22T22:25:15.490 回答