Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 将自定义列添加到延迟作业表_Ruby On Rails 3_Delayed Job - Fatal编程技术网

Ruby on rails 3 将自定义列添加到延迟作业表

Ruby on rails 3 将自定义列添加到延迟作业表,ruby-on-rails-3,delayed-job,Ruby On Rails 3,Delayed Job,有人能告诉我如何扩展delayed_jobs gem以允许我添加几个自定义列吗 我添加了几列,但当我尝试“干净地”使用它们时,我得到了: 无法批量分配受保护的属性:所有者类型、所有者id 因此,我需要将列添加到cattr_访问器: module Delayed class Worker DEFAULT_SLEEP_DELAY = 5 DEFAULT_MAX_ATTEMPTS = 25 DEFAULT_MAX_RUN_TIME = 4.hour

有人能告诉我如何扩展delayed_jobs gem以允许我添加几个自定义列吗

我添加了几列,但当我尝试“干净地”使用它们时,我得到了:

无法批量分配受保护的属性:所有者类型、所有者id

因此,我需要将列添加到cattr_访问器:

module Delayed
  class Worker
    DEFAULT_SLEEP_DELAY      = 5
    DEFAULT_MAX_ATTEMPTS     = 25
    DEFAULT_MAX_RUN_TIME     = 4.hours
    DEFAULT_DEFAULT_PRIORITY = 0
    DEFAULT_DELAY_JOBS       = true
    DEFAULT_QUEUES           = []
    DEFAULT_READ_AHEAD       = 5

    cattr_accessor :min_priority, :max_priority, :max_attempts, :max_run_time,
      :default_priority, :sleep_delay, :logger, :delay_jobs, :queues,
      :read_ahead, :plugins, :destroy_failed_jobs, **:owner_id, :owner_type**
但是,我们不确定扩展此功能的最佳方式。我的猜测/尝试是创建一个文件并将其添加到initializers目录。然而,由于某种原因,它没有起作用


非常感谢您的提示。

您真的需要扩展延迟工作表吗?我的方法是不使用它,而是使用以下两种技术之一:

  • 为正在排队的对象添加所有者id和所有者类型字段
  • 创建一个单独的表,该表与延迟的\u作业具有:归属\u to关系。然后使用DJ的钩子在作业的整个生命周期中保持两者的同步

第一种方法比较简单,但并不适用于所有情况。这两个选项中的任何一个对您有效吗?

另一个选项是在初始值设定项中添加以下行(例如config/initializers/delayed_job.rb):


其他答案可能有用,但它们并没有回答问题。要将自定义列添加到
delayed_jobs
表中,您可以执行以下操作。我这样做了,并成功地在
Delayed::Job
和其他对象之间创建了一个关联。

我可能会这样做,但其他开发人员已经添加了列。我想通过延迟访问这些列(:owner_id=>等)。否则,我必须创建一个DJ实例,并像分配任何其他对象一样分配值。这很好,但是在gem中添加少量代码会使它成为一个单行程序,而不是2,3,4…”“否则我必须创建一个DJ实例并像分配任何其他对象一样分配值。”--我不确定我是否理解该语句。如果您已经有一个自定义的可延迟对象(实现#perform的对象),那么您可以向其中添加您的:owner_id和:owner_type字段,而无需额外努力,不是吗?
Delayed::Job.attr_accessible :owner_type, :owner_id