Rails 4,创建回调后记录未保留&延迟工作

时间:2015-03-25 22:50:43

标签: ruby-on-rails ruby activerecord delayed-job

在创建'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的非持久对象。

2 个答案:

答案 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

问题是,延迟作业已将作业从队列中抢走,并尝试在数据库事务完成之前处理它。所以,当它调用数据库来查找你的新记录时,它实际上并不存在,即使你说“保存后”。