🐕

SidekiqでDecoratorオブジェクトを渡したときに実行時引数が元のモデルになっている(Draper, ActiveJob)

2023/09/27に公開

こちらに記載がありましたので、この通りですが。
https://github.com/drapergem/draper#active-job-integration

This means you can pass decorated objects to background jobs, however, the object won't be decorated when it is deserialized.

# こんな感じでDecoratorオブジェクトを作成し、perform_laterに渡すと・・・
deco = YourModelDecorator.decorate(YourModel.first)
YourJob.perform_later(deco)
	
# 実行時にはDecoratorではなく、元のモデルが渡される
class YourJob < ActiveJob::Base
	def perform(decorator)
		decorator.is_a?(YourModelDecorator) # => false
		decorator.is_a?(YourModel) # => true
	end
end

考えてみたら当たり前で、GlobalIDの仕組みはジョブ実行時にIDからレコードを取り出しているはずなので、Decoratorを戻すことはできない。

ただ、知らないと実行時にデコレータに定義したメソッドが呼び出せないなどのエラーで気づくことになるので、普通にperform_laterタイミングでエラーを吐いてくれた方が助かりそう・・・

モデルとGlobalIDの変換処理については、こちらが詳しかったです。
https://zenn.dev/stomk/articles/11f8c0dba0303e

Discussion