Reputation: 1710
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
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