永远不会调用after_commit

问题描述 投票:0回答:1

我在轨道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
ruby-on-rails sidekiq
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.