2012-08-28 6 views
3

Quelqu'un peut-il me montrer comment étendre la gemme delayed_jobs pour me permettre d'ajouter quelques colonnes personnalisées?Ajouter des colonnes personnalisées à la table delayed_jobs

J'ai ajouté des colonnes de couple, mais lorsque je tente de « proprement » les utilise, je reçois:

ne peut pas-Assign masse Attributs protégés: owner_type, OWNER_ID

donc je dois ajouter les colonnes cattr_accessor:

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** 

Cependant, vous ne savez pas quel est le meilleur moyen d'étendre cette fonctionnalité. Ma conjecture/tentative est de créer un fichier et de l'ajouter au répertoire des initialiseurs. Cependant, pour une raison quelconque, cela n'a pas fonctionné.

Des conseils appréciés.

Répondre

1

Avez-vous vraiment besoin d'étendre la table delayed_jobs? Mon approche a été de le laisser seul et d'utiliser l'une des deux techniques suivantes:

  • ajouter owner_id et owner_type champs l'objet en file d'attente.
  • créer une table séparée avec une relation: belongs_to à delayed_jobs. Ensuite, vous utilisez les crochets de DJ pour synchroniser les deux pendant la durée de vie du travail.

La première approche est plus simple, mais n'est pas adaptée à toutes les situations. Est-ce que l'un ou l'autre travaillerait pour vous?

+0

Je peux aller sur cette route - mais les autres développeurs ont déjà ajouté des colonnes. Je voudrais accéder à ces colonnes via delay (: owner_id => etc ...). Sinon je dois créer une instance de DJ et assigner les valeurs comme n'importe quel autre objet. C'est bien, mais en ajoutant une pointe de code à la gemme, cela ferait un one-liner vs 2,3,4 ... – Northband

+0

"Sinon, je dois créer une instance de DJ et assigner les valeurs comme tout autre objet " - Je ne suis pas sûr de comprendre cette affirmation. Si vous avez déjà un objet personnalisable avec délai (celui qui implémente #perform), vous pouvez y ajouter vos champs: owner_id et: owner_type sans effort supplémentaire, non? –

1

Une autre option consiste à ajouter simplement la ligne suivante dans votre initialiseur (. Ex config/initializers/delayed_job.rb):

Delayed::Job.attr_accessible :owner_type, :owner_id 
1

Les autres réponses peuvent être utiles, mais ils ne sont pas répondre à la question. Pour ajouter des colonnes personnalisées au tableau delayed_jobs, vous pouvez suivre this steps. Je l'ai fait et créé avec succès une association entre Delayed::Job et d'autres objets.

Questions connexes