在创建记录时跳过回调

时间:2018-09-06 10:44:04

标签: ruby-on-rails rails-activerecord

我有一个模型A,在after_commitcreate上有一个update回调。

class A < ApplicationRecord
  after_commit :update_xyz, on: [:create, :update]
end

此用例中有一个rake任务。我的rake任务尝试创建许多模型A记录,但必须跳过此update_xyz回调。

在创建记录时是否可以跳过这些回调?我不希望为此添加其他gem / plugins。

4 个答案:

答案 0 :(得分:1)

如果您希望有一种通常可以运行回调的方法,但是在特定时间可以跳过它,我通常会采用以下模式:

class User < ActiveRecord::Base
  attr_accessor :skip_do_something

  after_save :do_something

  private

    def do_something
      return if skip_do_something
      # do work here
    end
end

通过这种方式,通常将始终运行do_something回调,但是可以跳过以下操作:

user = User.find 1
user.skip_do_something = true
user.save

希望这会有所帮助。

答案 1 :(得分:0)

例如,您可以add a condition to your callback,例如:

class A < ApplicationRecord
  after_commit :update_xyz, on: [:create, :update], unless :rake_task?
end

并在适当的位置定义rake_task?

答案 2 :(得分:0)

经过一些研究,我找到了一个更好的解决方案

https://www.rubydoc.info/github/zdennis/activerecord-import/ActiveRecord%2FBase.import

users = [User.new(name: "Test1"), ....]

User.import(users)

不调用回调或验证,并且在创建n条记录时要快得多

答案 3 :(得分:0)

您可以这样做:

namespace :your_namespace do
  task :your_task => :environment do
    A.skip_callback(:commit, :after, :update_xyz)
    //do everything you need
    A.set_callback(:commit, :after, :update_xyz)
  end
end

有关更多信息,您可以检查此link