【问题标题】:Rails: delayed_job on an after_create callback? [closed]Rails:after_create 回调中的延迟作业? [关闭]
【发布时间】:2014-01-15 04:13:18
【问题描述】:

有没有办法使用delayed_job gem 在后台运行after_create 模型回调函数?

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

如何将模型配置为在后台运行?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 delayed-job


    【解决方案1】:

    是的,您应该能够从 ActiveRecord 回调中将 delay_job 任务排入队列。致install and use delayed_job

    1. gem 'delayed_job_active_record' 添加到您的Gemfile 并运行bundle install
    2. 通过运行在您的数据库中创建延迟作业支持表:

      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
    

    请注意,您应该use after_commit instead of after_create to schedule your job,这样您就可以避免在事务提交之前执行作业的情况。

    【讨论】:

    • after_commit 有一个问题——它会导致delayed_job 创建两个重复的作业。不知道为什么。而after_create 按预期完成了一项工作。
    • 知道为什么使用after_commit 会创建重复的工作吗?
    • 这很奇怪。您还记得添加on: :create 位吗?如果没有 on: 参数,after_commit 将在 all 提交事件上触发其回调,所以这是一个想法。
    • 另一种选择是将创建模型的代码手动封装在事务中 (MyModel.transaction do ... end),以确保这一切都发生在单个事务中。
    • 是的,我有on: :create。不知道为什么会产生重复项。很奇怪。
    猜你喜欢
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2011-10-04
    • 2020-10-23
    • 2013-05-01
    • 2020-06-21
    • 1970-01-01
    • 2020-10-09
    相关资源
    最近更新 更多