我在轨道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
答案 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