Sidekiq worker的参数应该是根据作者的这个维基(https://github.com/mperham/sidekiq/wiki/Best-Practices)的简单数据类型
由于全局ID (https://edgeguides.rubyonrails.org/active_job_basics.html#globalid),ActiveJob的参数可以是复杂的对象
可以将ActiveJob后端配置为使用Sidekiq。
那么,当我将复杂对象传递给具有Sidekiq后端的ActiveJob工作者时,幕后会发生什么呢?我不认为Sidekiq这次会因为“不能正确地在转储/加载往返过程中幸存下来”而失败。
发布于 2019-09-25 17:00:38
您可以使用#to_global_id查找模型的全局id
gid = MyModel.first.to_global_id
gid.uri # => #<URI ...
gid.to_s # => "gid://..."
GlobalID::Locator.locate(gid) # => #<MyModelGlobalID的代码是here。
它从应用程序名称、模型类、模型id和可选参数创建一个URI。这是在GlobalID::URI::GID中完成的。
您可以创建自己的GID,如下所示:
URI::GID.create('myapp', MyModel.first, database: 'my_app_development')
# => #<URI::GID gid://myapp/MyModel/1?database=my_app_development>传递的模型必须是ActiveRecord投诉,所以传递PORO (普通旧Ruby对象)将不起作用:
class MyModel
end
URI::GID.create('myapp', MyModel.new)
# => NoMethodError (undefined method `id'让我们添加一个id属性:
MyModel = Struct.new(:id)
gid = URI::GID.create('myapp', MyModel.new(1))
# => #<URI::GID gid://myapp/MyModel/1>
GlobalID::Locator.locate(gid)
# => NoMethodError (undefined method `find' for MyModel:Class)和一个类方法#find
MyModel = Struct.new(:id) do
def self.find(id)
new(id)
end
end
gid = URI::GID.create('myapp', MyModel.new(1))
GlobalID::Locator.locate(gid)
# => #<struct MyModel id="1">https://stackoverflow.com/questions/58091288
复制相似问题