【发布时间】: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
有没有办法使用delayed_job gem 在后台运行after_create 模型回调函数?
我有一个 private 函数用作回调 after_create :get_geolocation,在用户注册后运行。
如何将模型配置为在后台运行?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 delayed-job
是的,您应该能够从 ActiveRecord 回调中将 delay_job 任务排入队列。致install and use delayed_job:
gem 'delayed_job_active_record' 添加到您的Gemfile 并运行bundle install。通过运行在您的数据库中创建延迟作业支持表:
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
请注意,您应该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。不知道为什么会产生重复项。很奇怪。