首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sidekiq后端将复杂对象作为参数传递的ActiveJob

Sidekiq后端将复杂对象作为参数传递的ActiveJob
EN

Stack Overflow用户
提问于 2019-09-25 12:44:09
回答 1查看 773关注 0票数 0

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这次会因为“不能正确地在转储/加载往返过程中幸存下来”而失败。

EN

回答 1

Stack Overflow用户

发布于 2019-09-25 17:00:38

您可以使用#to_global_id查找模型的全局id

代码语言:javascript
复制
gid = MyModel.first.to_global_id

gid.uri # => #<URI ...

gid.to_s # => "gid://..."

GlobalID::Locator.locate(gid) # => #<MyModel

GlobalID的代码是here

它从应用程序名称、模型类、模型id和可选参数创建一个URI。这是在GlobalID::URI::GID中完成的。

您可以创建自己的GID,如下所示:

代码语言:javascript
复制
URI::GID.create('myapp', MyModel.first, database: 'my_app_development')
# => #<URI::GID gid://myapp/MyModel/1?database=my_app_development>

传递的模型必须是ActiveRecord投诉,所以传递PORO (普通旧Ruby对象)将不起作用:

代码语言:javascript
复制
class MyModel
end

URI::GID.create('myapp', MyModel.new)
# => NoMethodError (undefined method `id'

让我们添加一个id属性:

代码语言:javascript
复制
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

代码语言:javascript
复制
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">
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58091288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档