🐕
SidekiqでDecoratorオブジェクトを渡したときに実行時引数が元のモデルになっている(Draper, ActiveJob)
こちらに記載がありましたので、この通りですが。
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の変換処理については、こちらが詳しかったです。
Discussion