在创建'Klass'实例后,我有一个非常昂贵的方法,所以我想在DelayedJob中排队。
class Klass
has_many :klass_instances
after_create :create_klassinstances
def create_klassinstances
.....
delay.create_if_ok_to_create_klass_instances
.....
end
end
然而,这会引发错误
#<ArgumentError: job cannot be created for non-persisted record:
我真的不明白。我正在使用'after_create'回调,所以现在肯定会为Klass记录存在一个ID吗?我玩过pry并在create_klassinstances方法中调用'self'返回ID为nil的非持久对象。
答案 0 :(得分:0)
after_create
回调将无法访问持久化对象,因此该对象将没有ID。您必须使用after_save
回调来访问对象的ID。为了防止在将来的保存期间创建延迟的作业,您可以尝试这样的事情:
class Klass
has_many :klass_instances
after_save :create_klass_instances
def create_klass_instances
delay.now_create_klass_instances if klass_instances.empty?
end
end
答案 1 :(得分:0)
This Chap给了我正在寻找的答案。
总之,请使用after_commit
问题是,延迟作业已将作业从队列中抢走,并尝试在数据库事务完成之前处理它。所以,当它调用数据库来查找你的新记录时,它实际上并不存在,即使你说“保存后”。