Rails:如何在 after_create 回调中使用 delayed_job?

4

有没有一种方法可以使用delayed_job宝石在后台运行after_create模型回调函数?

我有一个private函数作为回调after_create :get_geolocation,在用户注册后运行。

我该如何配置模型以在后台运行该函数?

1个回答

9

是的,您应该能够从ActiveRecord回调中排队一个delayed_job任务。要安装和使用delayed_job:

  1. gem 'delayed_job_active_record'添加到您的Gemfile中并运行bundle install
  2. 通过运行以下命令在数据库中创建delayed_job支持表:

    rails generate delayed_job:active_record

    rake db:migrate

  3. 在您的模型中:

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则按预期只创建一个任务。 - Hopstream
使用 after_commit 会导致重复的作业,有什么想法吗? - Hopstream
很奇怪。你记得添加 on: :create 吗?如果没有 on: 参数,after_commit 将在 所有 提交事件上触发其回调,这是一个想法。 - Ash Wilson
是的,我有 on: :create。不确定为什么会创建重复项。非常奇怪。 - Hopstream
嗯,检查一下你的 development.log 输出——在创建模型的控制器操作期间是否有多个事务正在进行? - Ash Wilson
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接