【问题标题】:Rails 4, record not-persisted in after create callback & Delayed JobRails 4,创建回调和延迟作业后未保留的记录
【发布时间】:2015-03-26 07:44:26
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      This Chap 给了我想要的答案。

      总之,使用after_commit

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

      【讨论】:

        猜你喜欢
        • 2013-11-26
        • 1970-01-01
        • 1970-01-01
        • 2016-03-29
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-17
        相关资源
        最近更新 更多