我怎样才能找到()传递给sidekiq worker的资源?

How can I find() a resource passed to a sidekiq worker?

基本上,我有一段代码需要在 sidekiq worker 中执行,它将通过作为参数传递的资源进行交互(可能)。此资源是 Rails 模型。

与 SO 上有关将参数传递给工作人员的其他问题不同,在这里我不知道它是用户模型还是房屋模型。所以我不能简单地使用 MyWorker.perform(user_id),因为我不知道我将传递哪个模型 ID 作为参数。

此外,我读到我不能简单地期望将我的模型对象传递给 sidekiq worker 并在另一端接收它,一旦它将它转换为 json。

所以我的想法是这样的:

# somewhere_in_my_code.rb

MyWorker.perform(resource.id, resource_model) # still don't know what this resource_model would be

# my_worker.rb

def perform(resource_id, resource_model)
  model = some_magic_method_to_return_a_model(resource_model)
  resource = model.find(resource_id)

  # do what I have to do with the resource found
end

但是我真的不知道这个some_magic_method_to_return_a_model是否存在。或者如果这可能的话。无论如何,我们将不胜感激,谢谢!

注意:我使用的是 Ruby 2.4.8、Rails 4.1.10、Sidekiq 4.1.0

确实如此。假设您有一个 User 模型:

> user = User.last
> id = user.id
> model_name = user.model_name.name
> model_name.safe_constantize.find(id)
> model_name.safe_constantize.find(id) == user
=> true

这基本上就是多态关联在 Rails 中的工作方式。