Защо отложеното задание не зарежда моите сериализирани аргументи от DB?

Когато планирам отложената си работа, го правя по обичайния начин:

NotificationMailer.delay.notify(self, @current_user)

И ако надникна към обекта в опашката Delayed::Job (преди работникът да го види), мога да видя своя сериализиран параметър current_user в манипулатора:

[33] my_project »  Delayed::Job.first
  Delayed::Backend::ActiveRecord::Job Load (0.7ms)  SELECT "delayed_jobs".* FROM "delayed_jobs" ORDER BY "delayed_jobs"."id" ASC LIMIT 1
=> #<Delayed::Backend::ActiveRecord::Job:0x0000010d546fb0> {
          :id => 764161,
    :priority => 0,
    :attempts => 0,
     :handler => "--- !ruby/object:Delayed::PerformableMailer\nobject: !ruby/class 'SurveyCompletionNotificationMailer'\nmethod_name: :notify\nargs:\n- !ruby/ActiveRecord:MyInstance\n  attributes:\n    id: 10786\n   created_at: 2013-12-19 03:52:21.082910000 Z\n    updated_at: 2014-07-23 19:12:27.967755000 Z\n  delta: true\n- !ruby/ActiveRecord:User\n  attributes:\n    id: 30\n    first_name: Andrew\n    last_name: Anderson\n    created_at: 2013-01-16 16:40:20.980147000 Z\n    updated_at: 2013-01-16 16:40:20.980147000 Z\n    title: Compensation Analyst\n    primary_phone_number: '123456789'\n    supervisor_id: \n    status: modified\n    disabled: \n    prefix: \n    suffix: ''\n    department: ''\n    general_info: ''\n    contact_id: 4428\n    emulating: true\n",
  :last_error => nil,
      :run_at => Wed, 23 Jul 2014 14:12:27 CDT -05:00,
   :locked_at => nil,
   :failed_at => nil,
   :locked_by => nil,
       :queue => nil,
  :created_at => Wed, 23 Jul 2014 14:12:27 CDT -05:00,
  :updated_at => Wed, 23 Jul 2014 14:12:27 CDT -05:00
}

Но откривам, че отложената задача ще игнорира сериализираните аргументни данни и ще презареди потребителския запис от базата данни. Така че, ако записът на потребителя се промени между момента, в който заданието е на опашка и когато се изпълнява, ще се използват новите данни. Това не е това, което искам. Защо дори да си правите труда да сериализирате параметрите, ако няма да го използвате? Изпускам ли нещо? Има ли начин да накарам DJ да използва сериализираните аргументни данни?


person Daiku    schedule 23.07.2014    source източник


Отговори (1)


Това е поведението на DJ, той просто използва десериализирания id, за да зареди обекта ActiveRecord от DB (тук е свързан запис на ЧЗВ). Ако искате да направи нещо различно, ще трябва или да направите monkeypatch ActiveRecord, или да предадете атрибутите като допълнителни параметри на мейлъра.

person rabusmar    schedule 23.07.2014
comment
НЕ е отговорът, който исках, но предполагам, че трябва да го приема, тъй като изглежда правилен. - person Daiku; 24.07.2014