pyfl88
pyfl88

Reputation: 1710

Sidekiq and after_create callbacks

How can I run methods in background with sidekiq? Currently I have something like this:

order.rb

class Order < ActiveRecord::Base
include Badges
belongs_to :user

end

concerns/badges.rb

module Badges
 extend ActiveSupport::Concern

 included do
   after_update :badges
 end

 def badges
   streak = user.selling_streak.value
   case streak
     when 3
       user.add_badge(5) unless user.badges.any? {|b| b.id == 5}
     when 5
       user.add_badge(6) unless user.badges.any? {|b| b.id == 6}
   end
 end
end

I have put the badges method into concerns, and it will run on an after_update callback in order model. How can I put the whole method in background process with sidekiq?

Upvotes: 1

Views: 2135

Answers (1)

spickermann
spickermann

Reputation: 106952

To use sidekiq with in your app would be pretty straightforward. It is basically just following the examples from the sidekiq website and copy'n' pasting your code:

Change your concers/badges.rb to generate sidekiq jobs:

module Badges
  extend ActiveSupport::Concern

  included do
    after_update :assign_badges
  end

  def assign_badges
    BadgesAssignment.perform_async(user.id)
  end
end

And create a sidekiq worker class:

class BadgesAssignment
  include Sidekiq::Worker

  def perform(user_id)
    user = User.find_by(id: user_id)

    if user
      streak = user.selling_streak.value
      case streak
      when 3
        user.add_badge(5) unless user.badges.any? {|b| b.id == 5}
      when 5
        user.add_badge(6) unless user.badges.any? {|b| b.id == 6}
      end
    end
  end
end

Upvotes: 1

Related Questions