使用销毁的对象排队 ActiveJob 任务
Enqueue ActiveJob task with destroyed object
在控制器的操作中,我销毁了一条记录,然后将其作为参数传递给 ActiveJob。
def destroy
post = Post.find params[:id]
post.destroy
CleanUpJob.perform_later post
end
在我的工作中,我需要对那个被破坏的记录进行一些清理操作。
def perform(post)
log_destroyed_content post.id, post.title
end
当我用 .perform_later 延迟调用它时 - 它根本不执行。但是当我更改为 .perform_now - 它按预期工作。此作业需要处理已销毁和持久化的记录。
我正在使用 lates Rails,带有默认异步 activejob 适配器的开发环境。
而不是传递被销毁的 post
只是传递它的 id
和 title
.
# in the controller
def destroy
post = Post.find params[:id]
post.destroy
CleanUpJob.perform_later(post.id, post.title)
end
# in the job
def perform(post_id, post_title)
log_destroyed_content(post_id, post_title)
end
当您使用 ActiveRecord
对象调用 .perform_later
时,ActiveJob
将尝试将其序列化为 global id
您正在从数据库中删除您的记录,这意味着您的作业在运行时将找不到它。
您可以传递包含所有属性的散列:
CleanUpJob.perform_later(post.attributes)
或者,您可以标记要删除的模型,并在实际处理完记录后在作业中调用销毁。把它想象成先软删除记录:
# in the controller
def destroy
post = Post.find params[:id]
post.update(state: :archived) # or whatever makes more sense for your application
CleanUpJob.perform_later(post.id, post.title)
end
# in the job
def perform(post_id, post_title)
log_destroyed_content(post_id, post_title)
post.destroy
end
您需要确保从面向用户的查询中排除 'soft-deleted' 条记录。
在控制器的操作中,我销毁了一条记录,然后将其作为参数传递给 ActiveJob。
def destroy
post = Post.find params[:id]
post.destroy
CleanUpJob.perform_later post
end
在我的工作中,我需要对那个被破坏的记录进行一些清理操作。
def perform(post)
log_destroyed_content post.id, post.title
end
当我用 .perform_later 延迟调用它时 - 它根本不执行。但是当我更改为 .perform_now - 它按预期工作。此作业需要处理已销毁和持久化的记录。
我正在使用 lates Rails,带有默认异步 activejob 适配器的开发环境。
而不是传递被销毁的 post
只是传递它的 id
和 title
.
# in the controller
def destroy
post = Post.find params[:id]
post.destroy
CleanUpJob.perform_later(post.id, post.title)
end
# in the job
def perform(post_id, post_title)
log_destroyed_content(post_id, post_title)
end
当您使用 ActiveRecord
对象调用 .perform_later
时,ActiveJob
将尝试将其序列化为 global id
您正在从数据库中删除您的记录,这意味着您的作业在运行时将找不到它。
您可以传递包含所有属性的散列:
CleanUpJob.perform_later(post.attributes)
或者,您可以标记要删除的模型,并在实际处理完记录后在作业中调用销毁。把它想象成先软删除记录:
# in the controller
def destroy
post = Post.find params[:id]
post.update(state: :archived) # or whatever makes more sense for your application
CleanUpJob.perform_later(post.id, post.title)
end
# in the job
def perform(post_id, post_title)
log_destroyed_content(post_id, post_title)
post.destroy
end
您需要确保从面向用户的查询中排除 'soft-deleted' 条记录。