有没有一种方法可以使用delayed_job
宝石在后台运行after_create
模型回调函数?
我有一个private
函数作为回调after_create :get_geolocation
,在用户注册后运行。
我该如何配置模型以在后台运行该函数?
有没有一种方法可以使用delayed_job
宝石在后台运行after_create
模型回调函数?
我有一个private
函数作为回调after_create :get_geolocation
,在用户注册后运行。
我该如何配置模型以在后台运行该函数?
是的,您应该能够从ActiveRecord回调中排队一个delayed_job任务。要安装和使用delayed_job:
gem 'delayed_job_active_record'
添加到您的Gemfile
中并运行bundle install
。通过运行以下命令在数据库中创建delayed_job支持表:
rails generate delayed_job:active_record
rake db:migrate
在您的模型中:
class MyModel < ActiveRecord::Base
after_commit :get_geolocation, on: :create
private
def get_geolocation
end
handle_asynchronously :get_geolocation
end
after_commit
而不是after_create
来安排您的作业,这样可以避免作业在事务提交之前执行的情况。
after_commit
存在一个问题,它会导致delayed_job创建两个重复的任务。不确定原因。而after_create
则按预期只创建一个任务。 - Hopstreamafter_commit
会导致重复的作业,有什么想法吗? - Hopstreamon: :create
吗?如果没有on:
参数,after_commit
将在 所有 提交事件上触发其回调,这是一个想法。 - Ash Wilsonon: :create
。不确定为什么会创建重复项。非常奇怪。 - Hopstreamdevelopment.log
输出——在创建模型的控制器操作期间是否有多个事务正在进行? - Ash Wilson