有没有办法在创建提交后才在Rails模型上触发回调?

时间:2013-09-03 19:00:30

标签: ruby-on-rails-3.2 callback rails-activerecord

我正在呼叫#34;队列"来自after_create回调的方法,在模型实例创建后触发模型实例上的Sidekiq进程。然而,我的Sidekiq工作人员第一次接受这份工作时,记录还没有实现。

我知道有after_commit条记录,但我只希望对象在创建时排队,而不是在更新时排队。如何在没有任何涉及日期检查等问题的情况下实现这一目标?

2 个答案:

答案 0 :(得分: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_changes中的after_commit。 id键中的nil应仅适用于new_records。以下是previous_changes

的示例输出
{"name"=>[nil, "newest"], "id"=>[nil, "cBdjzQgxir45xQJ9UXGRSR"], "version_id"=>[nil, "cBdnAogxir45xQJ9UXGRSR"]}

答案 1 :(得分:1)

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

after_commit :queue, :on => :create

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