我在轨道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
我知道这并不是你提出的问题的答案。然而...
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