Search code examples
ruby-on-rails-4sidekiq

Sidekiq job execution context


I want to perform some tasks in background but with something like "run as". In other words, like a task was launched by the user from the context of his session.

Something like

def perform
    env['warden'].set_user(@task_owner_user)
    MyService::current_user_dependent_method
end

but I'm not sure it' won't collide with other tasks. I'm not very familiar with Sidekiq. Can I safely perform separate tasks, each with a different user context, somehow?


Solution

  • I'm not sure what your shooting for with the "run as" context, but I've always setup sidekiq jobs that need a unique object by passing the id in the perform. This way the worker always knows which object it is trying to work on. Maybe this is what you're looking for?

        def perform id
            user = User.find(id)
            user.current_user_dependent_method
        end
    

    Then setup a route in a controller for triggering this worker to start, something like:

      def custom_route_for_performing_job
        @users= User.where(your_conditions)
        @users.each do |user|
          YourWorker.perform_async user.id
        end
        redirect_to :back, notice: "Starting background job for users_dependent_method"
      end