永远不会调用after_commit

时间:2018-02-09 05:45:58

标签: ruby-on-rails sidekiq

我在轨道4.2.10上。我需要在after_save方法中使用sidekiq触发作业。但是在将对象提交到数据库之前触发了作业,因此我得到错误,找不到id = xyz的对象。

所以,我需要使用

after_commit :method_name, :on => [:create, :update]

但我在对象中所做的更改并没有出现在上面的方法中。我有一个属性email。当我在方法after_save上面调用时,email_changed?会返回true。但是如果我使用after_commit调用相同的方法,email_changed?将返回`false。

是因为我使用object.save方法而非create方法吗?

以下是我打电话来触发工作的方法:

def update_or_create_user
    if email_changed?
      ServiceUpdateDataJob.perform_later action: 'update', data: {type: 'user', user_id: self.id}
    end
    true
end

1 个答案:

答案 0 :(得分:0)

我知道这并不是你所提出问题的答案。然而...

IMO,你的模型责任正在超载。我建议您创建一个在保存模型时触发作业的服务。它可能看起来像:

class FooService

  attr_accessor :unsaved_record

  class << self

    def call(unsaved_record)
      new(unsaved_record).call
    end

  end

    def initialize(unsaved_record)
      @unsaved_record = unsaved_record
    end

    def call
      kick_off_job if unsaved_record.save
      !unsaved_record.new_record?
    end

  private

    def kick_off_job
      # job logic
    end  

end

您可以在控制器中使用该服务,例如:

class FooController < ApplicationController 

  def create
    @new_record = ModelName.new(record_params)
    if FooService.call(@new_record)
      # do successful save stuff
    else
      # do unsuccessful save stuff 
    end
  end

  ...

end