2016-12-19 4 views
3

У меня есть следующий фрагмент в моей работе:ActiveJob: Доступный переменного экземпляр между обратными вызовами

before_enqueue do |job| 
    # do something 
    @car = create_car 
end 


before_perform do |job| 
    # do something 
    @car.update(type: 'broken') 
end 

но когда работа выполняется @car является nil. Можно ли каким-либо образом передать переменную экземпляра из одного обратного вызова во второй? Даже только ID будет в порядке. Приветствия.

+0

Является ли это класс работы? Для чего нужна работа? То, что вы называете работой (угадывая не автомобиль), обычно передается в работу, как показано здесь. http://edgeapi.rubyonrails.org/classes/ActiveJob/Callbacks/ClassMethods.html Но если вы создали класс задания, вы можете создать переменную экземпляра в классе, которая используется в других методах/перехватах (просто переместите ' @ car' до уровня в области. – user3366016

+0

Вы не можете иметь переменные экземпляра, разделяемые между enqueueing и выполнением, поскольку фрагменты кода могут работать на совершенно разных серверах. В любом случае все, что вы пытаетесь достичь, кажется немного антиактивным так как вы делаете вещи, которые должны относиться к методу процесса задания в обратном вызове. Вы не должны делать дорогие и подвергать ошибкам вещи в обратных вызовах, так как будет чрезвычайно сложно отслеживать – bcd

ответ

1

Вы должны были бы сделать это переменная экземпляра прочь job и доступ таким образом:

class Car < ActiveJob::Base 
    attr_accessor :car 
end 

затем

before_enqueue do |job| 
    # do something 
    job.car = create_car 
end 

before_perform do |job| 
    # do something 
    job.car.update(type: 'broken') 
end