我有一个模型A
,在after_commit
和create
上有一个update
回调。
class A < ApplicationRecord
after_commit :update_xyz, on: [:create, :update]
end
此用例中有一个rake任务。我的rake任务尝试创建许多模型A
记录,但必须跳过此update_xyz
回调。
在创建记录时是否可以跳过这些回调?我不希望为此添加其他gem / plugins。
答案 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。