Rails/React项目:创建父模型Project后触发子模型关联任务
解决嵌套属性创建Cabinet时触发后台任务的问题
问题原因
通过Project的嵌套属性创建Cabinet时,流程走的是Projects控制器的create动作,不会经过Cabinets控制器的create方法,所以你在Cabinets控制器里添加的ShelfPartsJob.perform_later(@cabinet.id, 'CREATE')只会在单独调用Cabinet创建接口时生效。
解决方案
方案一:使用Cabinet模型回调(推荐)
在Cabinet模型中添加after_create_commit回调,这样无论Cabinet是单独创建还是通过嵌套属性创建,只要保存成功就会触发任务:
# app/models/cabinet.rb class Cabinet < ApplicationRecord belongs_to :project # 事务提交后触发任务,避免数据库未同步导致job找不到记录 after_create_commit :run_shelf_parts_job private def run_shelf_parts_job ShelfPartsJob.perform_later(self.id, 'CREATE') end end
方案二:在Projects控制器中手动触发任务
如果不想修改模型,可以在Projects控制器的create动作中,找到刚创建的Cabinet并调用任务:
# app/controllers/projects_controller.rb def create @project = Project.new(project_params) if @project.save # 获取创建的首个Cabinet(确保嵌套属性配置正确) first_cabinet = @project.cabinets.first ShelfPartsJob.perform_later(first_cabinet.id, 'CREATE') if first_cabinet # 后续响应逻辑(比如返回JSON) else # 错误处理逻辑 end end
注意事项
- 优先选择模型回调方案,它更符合Rails的约定,且能覆盖所有Cabinet创建的场景(包括后续可能的其他创建方式)。
- 使用
after_create_commit而非after_create,因为嵌套属性创建时可能在事务中,after_create_commit会等事务提交后再执行job,避免job执行时数据库中还没有这条Cabinet记录。
内容的提问来源于stack exchange,提问作者John Gerard
相关产品推荐
相关产品推荐

