나는 a common race condition을 피하기 위해 커밋 후에 실행해야하는 sidekiq 작업이 있습니다.인라인`after_commit` 레일에서 콜백
class User < ActiveRecord::Base
...
after_commit do |user|
if @enqueue_some_job
SomeJob.new(user).enqueue
@enqueue_some_job = nil
end
end
def verify
@enqueue_some_job = ...
...
save!
end
end
코드가 약간 엉망입니다.
class User < ActiveRecord::Base
def verify
if ...
run_after_commit do |user|
SomeJob.new(user).enqueue
end
end
...
save!
end
end
은 아무것도 이런 구문 (즉 임시 인스턴스 변수를 설정하는 방법에 의존하지 않는)을 지원하기 위해 레일에 존재하는 내장합니까 : 나는 차라리 어떻게 든이 같은 콜백 인라인을 포장 할 수있을 것? 또는 Rails를 확장하여 이와 같은 구문을 추가하는 라이브러리가 있습니까? 콜백을 선언 할 때
덕분에 최대 - 그래서 다음에 대한 인스턴스 변수를 설정해야 할 것 - (verify' 같은 경우'에서) 함수 내에서 라이브 검사에 대한 유감스럽게도 조건 그것들 각각. –
나는 당신이 무엇을 얻으려고하는지 정말로 이해하지 못하거나 당신이 정말로 그것을 overthinking 중입니다. if 절 또는'if' 옵션에서'verify' 메서드를 직접 사용할 수 있습니다 - 부울 조건으로 평가되는 메서드뿐만 아니라 인스턴스 변수/상태가 필요한 이유를 실제로 볼 수 없습니다. – max
또한 코드가 실행될 때 다소 혼란스러워 보입니다. 클래스가 평가 될 때 콜백이 선언됩니다. 두 번째 예제의 verify 메소드는 인스턴스 메소드입니다. 인스턴스로부터 싱글 톤 클래스를 변경하기 위해 메타 프로그래밍을 사용할 수 있지만, 이것은 당신이 원하는 것이 아닌 것 같습니다. – max